贪心
一、买卖股票的最佳时机II
收集每天的正利润,加起来等于最多利润
class Solution {
public:
int maxProfit(vector<int>& prices) {
//局部最优:收集每天的正利润
int result = 0;
int cur = 0;
int next = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(0, prices[i] - prices[i-1]);
}
return result;
}
};
二、跳跃游戏
在当前覆盖范围内求下一下最大覆盖范围,如果大于size,则说明能够走到终点
class Solution {
public:
bool canJump(vector<int>& nums) {
//跳跃的覆盖范围是否大于终点
/*棋子每次获得最大长度也就是覆盖范围,在判断覆盖范围内是否存在一个长度相加大于终点*/
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;
}
};
三、跳跃游戏II
难点在于什么时候走下一步,当当前范围内末尾位置没有包含终点时,向前走一步,再次计算最大覆盖范围
class Solution {
public:
int jump(vector<int>& nums) {
//当前覆盖范围没有到达终点时向前走一步
//已经到了覆盖范围则不会走
int cur = 0;
int next = 0;
int result = 0;
if (nums.size() == 1) return 0;
for (int i = 0; i <= cur; i++) {
next = max (next, i + nums[i]);
if (i == cur) {
result++;
cur = next;
if (cur >= nums.size() - 1) break;
}
}
return result;
}
};
总结
能想到思路,但是写不出代码
学习时间90min。
学习资料:《代码随想录》。