2026/4/18 5:44:32
网站建设
项目流程
招远网站建设联系电话,上海网站建设兴策,centos nginx wordpress,网站后台管理系统LeetCode 188 买卖股票的最佳时机 Ⅳ
题目链接#xff1a;188.买卖股票的最佳时机 Ⅳ 文档讲解#xff1a;代码随想录 视频讲解#xff1a;买卖股票的最佳时机 Ⅳ 思路与感想#xff1a;这道题目虽然是道hard但是在做过了股票系列Ⅲ后立马就有思路直接秒了#xff0c;跟Ⅲ…LeetCode 188 买卖股票的最佳时机 Ⅳ题目链接188.买卖股票的最佳时机 Ⅳ文档讲解代码随想录视频讲解买卖股票的最佳时机 Ⅳ思路与感想这道题目虽然是道hard但是在做过了股票系列Ⅲ后立马就有思路直接秒了跟Ⅲ的唯一区别就在于它有k次交易而非已知的两次了在代码上体现的差异点就是k次交易说明有2k 1种操作状态那在递推每一天的dp值得时候其实要求2k次dp[i][0]不用算默认为0再者自己去定义除了0之外奇数是购入偶数是卖出那很自然地就会想到在初始化和遍历每一天的时候都加一个for循环进行初始化或者递推因为购入和卖出的递推公式是不一样的。卡哥在遍历时也选择i2处理并没有像我一样一个个判断奇数偶数而是一次交易看作一个整体内部直接dp[i][j 1]和dp[i][j 2]。收获1.for循环内置批量处理多种状态// 动态规划 class Solution { public int maxProfit(int k, int[] prices) { int[][] dp new int[prices.length][2 * k 1]; // k次交易说明有2k 1种操作情况 for (int i 1; i 2 * k 1; i 2) { dp[0][i] - prices[0]; // 奇数买入股票偶数卖出进行dp数组初始化 } for (int i 1; i prices.length; i) { // 外层遍历第几天 for (int j 1; j 2 * k 1; j) { // 内层遍历当天所有操作情况递推每种情况的dp值 if (j % 2 ! 0) { dp[i][j] Math.max(dp[i - 1][j],dp[i - 1][j - 1] - prices[i]); // 奇数购入股票两种情况延续前一天同一个操作或者当天购入 } else { dp[i][j] Math.max(dp[i - 1][j],dp[i - 1][j - 1] prices[i]); // 偶数卖出股票同上 } } } return dp[prices.length - 1][2 * k]; } }LeetCode 309 买卖股票的最佳时机含冷冻期题目链接309.买卖股票的最佳时机含冷冻期文档讲解代码随想录视频讲解买卖股票的最佳时机含冷冻期思路与感想这道题目的状态挺难想的持有股票不持有股票当天卖出股票冷冻期。回过头来再看的话持股与不持股或许可以延续前面的题目想到这么设置状态然后题目多了个冷冻期那势必也要给冷冻期设置一个状态然后在你想着如何对冷冻期的DP值进行递推的时候自然会想到利用它前一天正好卖出股票来实现但是现在只有不持股这个摸棱两可的状态所有你不得不从不持股里面抽出来一种当天卖出股票的状态那另一种状态就是保持卖出股票的状态这样才可以递推冷冻期状态。当然这都是事后诸葛亮了四种状态不仅难想而且即便想出来了可能递推公式也不一定写对。而且通过这道题我发现了DP类型题目的状态不是唯一的不同题解可能有不同的设置最重要的是自洽。另外在初始化的时候dp[0][1]、dp[0][2]还有dp[0][3]明显根据题意是个非法dp值所以这个时候不能死扣定义而是要回归到递推公式上找一个近一点的状态递推看看要初始化成什么值才能让递推符合提议逻辑。这样就知道要把他们都初始化成0这样才会让第0天之后的日子现金数正常。收获1.多思考状态想全状态的同时考虑每个状态之间能不能递推出来不能的话能不能通过从原有状态中抽取状态实现递推连接2.初始化遇到非法dp值从递推公式下手class Solution { public int maxProfit(int[] prices) { int[][] dp new int[prices.length][4]; // DP数组第二维下标含义0 持有股票的状态。1 不持有股票的状态。2 当天卖出股票的状态。3冷冻期状态 dp[0][0] - prices[0]; // 初始化第0天持有股票即当天买入股票。 注之所以多设置一个当天卖出股票的状态是因为冷冻期前一天一定是当天卖出股票多了冷冻期就要多一个当天卖出否则光一个不持有股票就笼统了推不出冷冻期的DP值 for (int i 1; i prices.length; i) { dp[i][0] Math.max(dp[i - 1][0],Math.max(dp[i - 1][1] - prices[i],dp[i - 1][3] - prices[i])); // 持有股票 三种情况1.延续前一天的持有 2.前一天不持有当天买入 3.前一天冷冻当天买入 dp[i][1] Math.max(dp[i - 1][1],dp[i - 1][3]); // 不持有股票 两种情况1.延续前一天不持有 2.前一天冷冻期 dp[i][2] dp[i - 1][0] prices[i]; // 当天卖出 一种情况前一天肯定持有股票 dp[i][3] dp[i - 1][2]; // 冷冻期 一种情况前一天肯定卖出股票 } return Math.max(dp[prices.length - 1][1],Math.max(dp[prices.length - 1][2],dp[prices.length - 1][3])); } }LeetCode 714 买卖股票的最佳时机含手续费题目链接714.买卖股票的最佳时机含手续费文档讲解代码随想录视频讲解买卖股票的最佳时机含手续费思路与感想题目跟之前的Ⅱ除了要手续费外基本上一模一样的代码就是在出售股票的时候减去手续费就行了没什么难度。收获1.重温持有不持有两种状态class Solution { public int maxProfit(int[] prices, int fee) { int[][] dp new int[prices.length][2]; // 两种状态持有或者不持有股票 dp[0][1] - prices[0]; // 初始化第0天持有股票的资金数 for (int i 1; i prices.length; i) { dp[i][0] Math.max(dp[i - 1][0],dp[i - 1][1] prices[i] - fee); // 两种情况第一种继承前一天不持有状态第二种当天卖出股票需要手续费 dp[i][1] Math.max(dp[i - 1][1],dp[i - 1][0] - prices[i]); // 同上 } return dp[dp.length - 1][0]; } }今天算法还算轻松花了三个小时多一点第一题和第三题都跟前面的股票系列很像所以两个一下子就秒掉了第二题状态很多而且很难想不过收获也是最大的。今天把基于vue框架的前端工程化开发看了下了解了各种Element的使用、Axios的实现明天就可以开springboot了打算这块学完把外卖点评顺手敲了。