122.买卖股票的最佳时机II![]()
不会做!!! 看题解
class Solution { public: //没想法,看到有两种解法,贪心或者动态规划。动态规划股票貌似是一个系列,那先做贪心 int maxProfit(vector<int>& prices) { int n=prices.size(); /*考虑相邻差值,然后只收集正值,因为prices[4]-prices[1]==prices[4]-prices[3] +prices[2]-prices[1] 则先设一个相邻的差值的数组,大小为n-1 */ vector<int>v(n-1,0); int sum=0; for(int i=0;i<n-1;i++) { v[i]=prices[i+1]-prices[i]; if(v[i]>0) { sum+=v[i]; } } return sum; } };
55. 跳跃游戏
链接:代码随想录
解:这一版没有通过
class Solution { public: //这个好像做过,涉及每一步能覆盖的最远距离,然后更新能连续的最大距离是否能达到最后一个 bool canJump(vector<int>& nums) { int farest=0; int n=nums.size(); for(int i=0;i<=farest;i++) { farest=max(farest,i+nums[i]); if(farest>=n) { return true; } } return false; } };
正确答案,这次经过重新思考,确定最后一个farest到达n-1即可。
class Solution { public: //这个好像做过,涉及每一步能覆盖的最远距离,然后更新能连续的最大距离是否能达到最后一个 bool canJump(vector<int>& nums) { int farest=0; int n=nums.size(); for(int i=0;i<=farest;i++) { farest=max(farest,i+nums[i]); if(farest>=n-1) { return true; } } return false; } };
45.跳跃游戏II
本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。
想了一些很初级的做法,但是全都不对。
版本二 class Solution { public: int jump(vector<int>& nums) { int curDistance = 0; // 当前覆盖的最远距离下标 int ans = 0; // 记录走的最大步数 int nextDistance = 0; // 下一步覆盖的最远距离下标 for (int i = 0; i < nums.size() - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在 nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标 if (i == curDistance) { // 遇到当前覆盖的最远距离下标 curDistance = nextDistance; // 更新当前覆盖的最远距离下标 ans++; } } return ans; }
注意!!!更新的是nextDistance!!!代码不好理解,建议背诵!!!!