LeetCode122.买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
思路:
最终利润是可以分解的
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.跳跃游戏
思路:
关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
if(nums.size() == 1) return true;
for(int i = 0;i <= cover; i++) {//小于cover,其是动态覆盖
cover = max(i + nums[i],cover);
if(cover >= nums.size() - 1) return true;//可以覆盖终点
}
return false;
}
};
LeetCode 45.跳跃游戏II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
思路:
贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。
要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!
这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1) return 0;
int cur = 0;//当前覆盖最远距离下标
int result = 0;//记录走的最大步数
int next = 0;//下一步覆盖最远距离目标
for(int i = 0;i < nums.size();i++) {
next = max(nums[i] + i, next);//更新下一步覆盖的最远距离下标
if(i == cur) {//遇到当前覆盖最远距离下标
result++;//要走下一步
cur = next;//更新当前覆盖最远距离下标
if(next >= nums.size() - 1) break;//当前覆盖最远距离到达集合终点
}
}
return result;
}
};