122.买卖股票的最佳时机II题目链接
思路
可将最终结果拆分成每天的利润相加之和
解题方法
局部最优:每天的正利润
整体最优:正利润之和
Code
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])>0)
{
result+=prices[i]-prices[i-1];
}
}
return result;
}
};
复杂度
时间复杂度:
O(n)
空间复杂度:
O(1)
55. 跳跃游戏 题目链接
思路
贪心贪的是:覆盖范围
解题方法
局部最优,nums[i]的覆盖范围
整体最优,整体覆盖范围能否达到终点
Code
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;
}
};
复杂度
时间复杂度:
O(n)
空间复杂度:
O(1)
45.跳跃游戏II 题目链接
思路
贪心:以最小的步数,覆盖最大的范围。因此,需要统计当前最大范围和下一步最大范围。
解题方法
当i遍历到当前最大范围时:
如果当前最大范围覆盖到数组最后了,就break;如果没有,result++,更新当前范围为下一步范围,更新完之后,如果范围覆盖到数组最后,就break。
如果没有:break
Code
class Solution {
public:
int jump(vector<int>& nums) {
int result=0;
int cur=0;
int next=0;
if(nums.size()==1)return 0;
for(int i=0;i<nums.size();i++)
{
next=max(i+nums[i],next);
if(i==cur)
{
if(cur!=nums.size()-1){
cur=next;
result++;
if(cur>=nums.size()-1)break;
}
else break;
}
}
return result;
}
};
复杂度
时间复杂度:
O(n)
空间复杂度:
O(1)