一LeetCode122. 买卖股票的最佳时机 II
题目链接:122. 买卖股票的最佳时机 II
这道题还是比较简单的。
题目给出某只股票连续天的价格,且可以在同一天购买和抛售。
那么要求最大的利润只需要比较相邻的价格,后面的价格比前面的价格高就有利润,只需依次加上可得利润的相邻股票价格之差就可以了(后面减去前面需是正数)。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for(int i = 0; i < prices.size() - 1; i++) {
if(prices[i] < prices[i + 1]) sum += (prices[i + 1] - prices[i]);//如果后一天价格高于前一天就有利润。
}
return sum;
}
};
二、LeetCode55. 跳跃游戏
题目链接:55. 跳跃游戏
通过遍历数组来寻找每次跳跃所能覆盖的最大下标范围。
首先覆盖的是下标0,然后根据下标0的数值,更新跳跃能够覆盖的最大下标(如果最大下标大于等于数组的最大下标,说明是可以跳跃到数组最后一个下标的),然后依次向右遍历到最大下标(当然每遍历一个数值,都要进行更新覆盖到的最大下标)。
代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int cov = 0;//寻找覆盖的最大范围
for(int i = 0; i <= cov; i++) {
cov = cov > i + nums[i] ? cov : i + nums[i];//每次更新覆盖范围的最大值
if(cov >= nums.size() - 1) return true;//如果最大能覆盖完整个数组,说明可以跳到最后一个下标
}
return false;
}
};
三、LeetCode45. 跳跃游戏 II
题目链接:45. 跳跃游戏 II
这道题还是比较难的。
需要记录当前步数和下一步所能覆盖的最大范围。
同时实时更新下一步的覆盖范围,当走到当前步数的最大范围时要让步数加一,还要更新当前的步数最大覆盖范围。
代码如下:
class Solution {
public:
int jump(vector<int>& nums) {
int ans = 0;//记录跳跃步数
int curdistance = 0;//记录当前步数下覆盖到的最大范围
int nextdistance = 0;//记录下一步覆盖到的最大范围
for(int i = 0; i < nums.size() - 1; i++) {
nextdistance = max(i + nums[i], nextdistance);//更新下一步的最大范围
if(i == curdistance) {//如果走到当前步数的最大范围,步数加一,更新当前步数覆盖到的最大范围
ans++;
curdistance = nextdistance;
}
}
return ans;
}
};
总结
贪心的算法确实比较困难。