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;}
方法二這個精簡很巧妙,值得學習。