122. 买卖股票的最佳时机 II
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/
算法思路:
贪心的思想。只要去考虑每一天的利润,今天的利润是今天的股票价格-昨天的股票价格,只取正数的利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for(int i=1;i<prices.size();i++)
{
sum += prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0;
}
return sum;
}
};
55. 跳跃游戏
题目链接:https://leetcode.cn/problems/jump-game/
算法思想:
遍历当前走到的步数能覆盖的范围,然后计算下一个覆盖范围,当覆盖范围能覆盖终点,则可以走到。否则走不到。
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(nums[i] + i, cover); //计算出最大的覆盖范围,然后再去遍历这个覆盖范围
if(cover>=nums.size()-1)
return true;
}
return false;
}
};
https://leetcode.cn/problems/jump-game-ii/
算法思想:
用for循环模拟走到的地方。
nextdistance记录当前i下一步能走到的最大覆盖范围
curdistance记录当前的最大覆盖范围
如果i走到当前覆盖范围的最远位置却还没到达终点的时候,步数需要+1,然后更新当前覆盖范围为下一步的覆盖范围,重新走。
class Solution {
public:
int jump(vector<int>& nums) {
//记录下一步的最远距离下标
//判断当前的覆盖范围是否已经到达终点了,没有到达就记录步数+1
//走到下一步时更新当前覆盖范围下标
int nextdistance = 0;
int curdistance = 0;
int ans = 0;
if(nums.size()==1)
return 0;
for(int i=0;i<nums.size();i++)
{
nextdistance = max(nums[i]+i, nextdistance);
if(i == curdistance) //如果已经走到最远的地方了,还是没到终点
if(i <=nums.size()-1)
{
ans++;
curdistance = nextdistance;
if(curdistance >=nums.size()-1)
break;
}
else
break;
}
return ans;
}
};