美文网首页
代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、

作者: eagleX | 来源:发表于2023-09-08 18:42 被阅读0次

    122.买卖股票的最佳时机II 

    收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间

    局部最优:收集每天的正利润,全局最优:求得最大利润

    intmaxProfit(vector<int>&prices){intresult=0;for(inti=1;i<prices.size();i++){result+=max(prices[i]-prices[i-1],0);}returnresult;}

    55. 跳跃游戏

    问题转化为跳跃覆盖范围究竟可不可以覆盖到终点

    贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

    i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。

    而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。

    如果 cover 大于等于了终点下标,直接 return true 就可以了

    boolcanJump(vector<int>&nums){intcover=0;if(nums.size()==1)returntrue;// 只有一个元素,就是能达到for(inti=0;i<=cover;i++){// 注意这里是小于等于covercover=max(i+nums[i],cover);if(cover>=nums.size()-1)returntrue;// 说明可以覆盖到终点了}returnfalse;}

    45.跳跃游戏II 

    贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数

    覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数

    需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

    intjump(vector<int>&nums){if(nums.size()==1)return0;intcurDistance=0;// 当前覆盖最远距离下标intans=0;// 记录走的最大步数intnextDistance=0;// 下一步覆盖最远距离下标for(inti=0;i<nums.size();i++){nextDistance=max(nums[i]+i,nextDistance);// 更新下一步覆盖最远距离下标if(i==curDistance){// 遇到当前覆盖最远距离下标ans++;// 需要走下一步curDistance=nextDistance;// 更新当前覆盖最远距离下标(相当于加油了)if(nextDistance>=nums.size()-1)break;// 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束}}returnans;}

    方法二这个精简很巧妙,值得学习。

    相关文章

      网友评论

          本文标题:代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、

          本文链接:https://www.haomeiwen.com/subject/cjddvdtx.html