day32
122. 买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II
直接判断相邻的是增长还是减弱,第一遍直接AC了
class Solution {
public:
int maxProfit(vector<int>& prices) {
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;
}
};
55.跳跃游戏
题目链接:55. 跳跃游戏
从第一个数组开始,找到数的覆盖范围,然后遍历覆盖范围中的每个数,找到最大的覆盖范围,不断去循环遍历,判断条件就是cover是否大于等于数组的最后一个元素的小标
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 = max( i+nums[i], cover);
if( cover >= nums.size()-1) return true;
}
return false;
}
};
45.跳跃游戏II
题目链接:45. 跳跃游戏 II
局部最优:当可移动距离尽可能多,没到终点时候,步数加1
整体最优:一步尽可能多走,达到最小步数
所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!
需要统计两个覆盖范围:当前的最大覆盖和下一步的最大覆盖
- 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
- 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
class Solution {
public:
int jump(vector<int>& nums) {
int cur = 0;
int next = 0;
int result = 0;
for( int i = 0; i < nums.size(); i++){
next = max( i+nums[i],next); //获得最大覆盖范围
if( i == cur ){
if( cur < nums.size()-1){
result++;
cur = next;
if( next >= nums.size()-1) break;
}
else break;
}
}
return result;
}
};