一、题目打卡
1.1 买卖股票的最佳时机
题目链接:. - 力扣(LeetCode)
class Solution {
public:int maxProfit(vector<int>& prices) {if(prices.size() == 1) return 0;// int result = 0;// int prediff = 0;// int curdiff = 0;// int tmp = 0; // 存储低谷 i 的位置// for(int i = 0, j = 1; j < prices.size();i++,j++){// curdiff = prices[j] - prices[i];// if(curdiff > 0 && prediff <=0){// tmp = i;// }// else if(curdiff <= 0 && prediff > 0){// result += prices[i] - prices[tmp];// }// else if(curdiff)// prediff = curdiff;// }// return result;int result = 0;for(int i = 0; i < prices.size() -1 ; i++){if(prices[i+1] - prices[i] >=0) result+=prices[i+1]-prices[i];}return result;}
};
好好好,我专门考虑记录波峰波谷,结果案例过不去,然后突然醒悟,如果是贪心全部加上正区间不就可以了,然后发现确实是,我只能说,确实挺贪心的,这样等于是买了,只要是正的第二天就卖。
1.2 跳跃游戏
题目链接:. - 力扣(LeetCode)
class Solution {
public:bool canJump(vector<int>& nums) {if(nums.size() == 1) return true;int cover = nums[0];for(int i = 0; i <= cover;i++){ // 这里要带等于,否则123会被误判// if(nums[i] + 1 >= nums.size() - 1) return true;// cover = max(nums[i] + nums[nums[i]],cover);// if(cover >= nums.size() - 1) return true;cover = max(i + nums[i], cover);if(cover >= nums.size() - 1) return true;}return false;}
};
答案有一种解法和这个思路是一样的,这样不断更新迭代范围的方法第一次尝试,踩坑的点有两个,一个是cover的那里,必须要带等号,第二个是更新 cover 的过程,我之前写错了,那样逻辑也不对,而且会越界。
1.3 跳跃游戏II(答案思路)
题目链接:. - 力扣(LeetCode)
class Solution {
public:int jump(vector<int>& nums) {int res = 0, curCover = 0, nextCover = 0;for(int i = 0 ; i < nums.size() - 1; i++){nextCover = max(nums[i] + i,nextCover);if(i == curCover){res++;curCover = nextCover;}}return res;}
};
感觉自己做完全想不到这个写法,思考的大方向虽然没问题,但是细节想不清楚,答案我感觉我理解的也不是很透彻,但是这种题目也没有泛化性,所以不强求了,先标记一下留在这里吧。