LeetCode122.買賣股票的最佳時機II
那么這里面根據貪心思想:
1、在最低點時買入,如果該點比上一點價格更低,只有兩種情況:上一點為買入點,則此時更新買入點;上一點不是買入點,則此時將股票賣出,并更新買入點
2、在最高點賣出,如果該點比上一點價格更高,則繼續向后觀望,直到最高的點。
3、首尾處的結果,避免價格一直是單調序列,因此在結尾處再添加一個賣出的操作。
代碼如下:
class Solution {
public:int maxProfit(vector<int>& prices) {int sum = 0;int i = 0;int buy = 0;while(i<prices.size()){if(i>0 && (prices[i]<prices[i-1] || prices[i]<prices[buy])){sum += prices[i-1]-prices[buy];buy = i;}i++;}sum += prices[prices.size()-1]-prices[buy];return sum;}
};
但是卡哥代碼的思想比上述巧妙多了,計算出每兩天之間的利潤,只取正數利潤相加即可求得最終結果,代碼如下:
class Solution {
public:int maxProfit(vector<int>& prices) {int result = 0;for (int i = 1; i < prices.size(); i++) {result += max(prices[i] - prices[i - 1], 0);}return result;}
};
LeetCode55. 跳躍游戲
本題關鍵的思路在于覆蓋,只要取到任何一個點他下一步能覆蓋到終點時就可以。
有一個錯誤點在于for循環時終止條件不應該是nums.size(),而是cover,這樣就可以解決[1,0,...]的情況,并且cover是需要一直更新的。
代碼如下:
class Solution {
public:bool canJump(vector<int>& nums) {if(nums.size()==1) return true;int cover = 0;for(int i=0;i<=cover;i++){cover = max(i+nums[i],cover);if(cover>=nums.size()-1) return true;}return false;}
};
LeetCode45.跳躍游戲II
思路確實不太好想,貪心的策略就是盡量每一步走到最遠處,那么如何判斷下一步的最遠處呢?那么這里就需要一直遍歷到當前步的最遠處,來不斷更新下一步的最遠處,并且步數+1,就跳到下一步的循環當中,當下一步的最遠處涵蓋了終點時,則就可以返回。
代碼如下:
class Solution {
public:int jump(vector<int>& nums) {if(nums.size()==1) return 0;int curCover = 0;int nextCover = 0;int result = 0;for(int i=0;i<nums.size();i++){nextCover = max(i+nums[i],nextCover);if(i==curCover){result++;if(nextCover>=nums.size()-1) return result;curCover = nextCover;}}return result;}
};