122.买卖股票的最佳时机II
讲解链接:https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html
简单思路:逐个计算连续两天的股票差值,sum初始为零,只有出售股票赚钱(为正值)时,计入sum中
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> Diff(prices.size()-1,0);
int sum = 0;
for(int i=0;i<prices.size()-1;i++) {
Diff[i] = prices[i+1]-prices[i];
if(Diff[i]<=0)
continue;
else
sum+=Diff[i];
}
return sum;
}
};
55. 跳跃游戏
讲解链接:https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html
不用一步一步推过程,
局部最优,计算
cover记录最大到达的下标位置
更新cover: i+nums[i] 和 当前最大到达下标
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
讲解链接:https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html
计算下一步的最大到达距离
若当前最远距离下标未到终点,ans(记录步数)加一
然后更新为当前最大覆盖距离
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1)
return 0;
//记录最远距离下标
int curDistance = 0;
//记录走的步数
int ans = 0;
int nextDistance = 0;
for(int i=0;i<nums.size();i++) {
//更新下一步覆盖的最远距离下标
nextDistance = max(nums[i]+i,nextDistance);
//遇到走的最远距离的时候还没有到结尾
if(i==curDistance) {
//需要再走一步
ans ++;
//更新覆盖最远距离下标
curDistance = nextDistance;
//最远距离到集合终点,结束
if(nextDistance >= nums.size() -1)
break;
}
}
return ans;
}
};