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;}
方法二这个精简很巧妙,值得学习。
网友评论