122.买卖股票的最佳时机II
本题解法很巧妙,大家可以看题思考一下,在看题解。
Tips:这道题解是自己想出来的,整体思路就是如果下一天股价变低了就在上一天抛掉。然后记得最后一天要单独处理,免得没有卖掉持仓。
我的题解:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int cost = prices[0];
int profit = 0;
for(int i = 1; i< prices.size();i++){
if(prices[i] < prices[i-1]){
profit += prices[i - 1] - cost;
cost = prices[i];
}
else if( i == prices.size() - 1){
profit += prices[i] - cost;
}
}
return profit;
}
};
55.跳跃游戏
本题如果没接触过,很难想到,所以不要自己憋时间太久,读题思考一会,没思路立刻看题解
https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html
Tips:
其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
局部最优推出全局最优,找不出反例,试试贪心!
如图:
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。
如果cover大于等于了终点下标,直接return true就可以了。
我的题解:
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size() == 1) return true;
int cover = 0;
for(int i = 0; i<nums.size() && i <= cover; i++){
cover = cover > i + nums[i] ? cover : i + nums[i];
if(cover >= nums.size() - 1){
return true;
}
}
return false;
}
};
45.跳跃游戏II
本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。
https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html
Tips:
真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!
这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。
我的题解:
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1){
return 0;
}
int count = 0;
int curDistance = 0;
int nextDistance = 0;
// 如果到了终点自然就跳出循环了
for(int i = 0; i<nums.size();i++){
//一直更新下一步的范围
nextDistance = max(nextDistance, i + nums[i]);
if(i == curDistance){
// 如果还没到终点的话,就走一步
if(i < nums.size() - 1){
count++;
curDistance = nextDistance;
}
else break;
}
}
return count;
}
};
标签:游戏,int,cover,E6%,II,prices,跳跃,覆盖范围 From: https://www.cnblogs.com/GavinGYM/p/17099944.html