代码随想录day32 | 122.买卖股票的最佳时机II 55. 跳跃游戏 45. 跳跃游戏 II
122.买卖股票的最佳时机II
思路
因为每天都可以将股票买入和卖出,因此,我们可以将买卖时机进行分解。
局部最优:如果当天的利润为正,则加入,如果当天利润为负,则不加入。
整体最优:所有天数的利润综合最大
实现
点击查看代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for(int i = 1; i < prices.size(); i++) {
if(prices[i] > prices[i-1]) {
result += prices[i] - prices[i-1];
}
}
return result;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
55. 跳跃游戏
思路
如果当前位置为3,到底一次跳到1,2还是3并不重要,重要的是当前位置以及之前位置所能跳跃到的最大的位置。
我们需要记录一个值max记录当前以及之前的跳跃所能覆盖的范围,如果max包括当前的位置,那么可以进行跳跃。当最大值大于max值时,对max进行更新。如果覆盖的范围包括最后一个值的位置,那么就能到达最远的位置。
实现
点击查看代码
class Solution {
public:
bool canJump(vector<int>& nums) {
int max = 0;
int cur = 0;
for(int i = 0; i < nums.size(); i++) {
if(max >= i) {
cur = i + nums[i];
max = max > cur ? max : cur;
}
//cout<< max << endl;
}
return max >= nums.size()-1;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
45. 跳跃游戏 II
思路
当当前的值为3时,我们不需要知道跳1,2还是3步,需要知道的是每一步可以到达的最远的位置。以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数。
相比于44题,这道题需要知道下一步的最远位置来对这一步的最远位置进行更新。
- 当到达当前最远位置时,如果不是终点继续更新
- 如果是终点,那么直接返回,不需要继续更新。
实现
点击查看代码
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() <= 1) return 0;
int result = 0;
int curdistance = 0;
int nextdistance = 0;
for(int i = 0; i < nums.size(); i++) {
nextdistance = max(nextdistance, nums[i] + i);
if(i == curdistance) {
if(curdistance != nums.size()-1) {
result++;
curdistance = nextdistance;
}
}
}
return result;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?