122 买卖股票的最佳时机II(medium)
只收正利润
注意数组越界
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
for(int i=0;i<prices.size()-1;i++){
result+=max(prices[i+1]-prices[i],0);
}
return result;
}
};
55 跳跃游戏(medium)
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==1) return true;
int cover=0;
for(int i=0;i<=cover;i++){
cover=max(i+nums[i],cover);
if(cover>=nums.size()-1) return true;
}
return false;
}
};
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1) return 0;
int ans=0;
int cur=0;
int next=0;
for(int i=0;i<nums.size();i++){
next=max(i+nums[i],next);
if(i==cur){
ans++;
cur=next;
if(next>=nums.size()-1) break;
}
}
return ans;
}
};
一个简单的示例 [2, 3, 1, 1, 4]
来模拟这个过程:
初始状态:
curDistance = 0
: 当前覆盖最远距离下标为 0ans = 0
: 记录走的最大步数为 0nextDistance = 0
: 下一步覆盖最远距离下标为 0
我们从第一个位置开始,即 nums[0]
,在位置 0,nums[0]
为 2,意味着我们可以跳到位置 1 或位置 2。
- 我们选择跳到位置 1,
nextDistance
更新为max(2+0, 0) = 2
。 - 当
i
等于curDistance
(当前覆盖最远距离下标)时,意味着我们已经达到了当前所能跳到的最远距离,所以我们需要再走一步。 - 我们更新
curDistance
为nextDistance
,现在curDistance
为 2,意味着我们现在处于位置 1 的时候可以跳到的最远距离。 - 如果
nextDistance
大于等于数组的长度减 1,说明已经到达了数组的末尾,我们就不需要再走额外的步数了,可以直接结束。 - 此时
ans
增加为 1,表示我们走了一步。
下一步:
- 我们现在位于位置 1,可以选择跳到位置 2 或位置 3。这里选择跳到位置 3,
nextDistance
更新为max(1+3, 2) = 4
。 - 当
i
等于curDistance
时,我们需要再走一步。更新curDistance
为nextDistance
,现在curDistance
为 4,表示我们可以从位置 2 跳到的最远距离。 nextDistance
已经大于等于数组的长度减 1,所以直接结束。
最终结果为 ans = 2
,表示到达数组末尾所需的最少跳跃次数为 2。
ps:leetcode规定一定可以跳到终点,只需要判断最小步数