Day32 贪心第二天
LeetCode 122 买卖股票的最佳时机 II
思路真是无比巧妙,把区间利润拆成每天的利润,其实就是算出每天的利润,然后只取其中的正值即可。
在代码中计算是否计算加时还与0取最大值,相当于大于0才加入。
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res=0;
for(int i=1;i<prices.size();i++)
res+=max(prices[i]-prices[i-1],0);
return res;
}
};
LeetCode 55.跳跃游戏
本题的关键在于不再纠结我们如何跳,而是一直考虑最远能跳到哪里,也就是跳跃的覆盖范围,如果覆盖范围大于等于最后一个元素的下标,那就是能跳到,否则就跳不到了。
cpp
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(cover,i+nums[i]);
if(cover>=nums.size()-1)
return true;
}
return false;
}
};
LeetCode 45.跳跃游戏II
本题的关键在于每次跳跃时都取能让跳跃覆盖范围变得更大的下一跳,而且我们也不用考虑应该怎么跳,只需要增加每一步能扩展的最大范围即可,只要范围比大于等于末尾元素的下标,那就成功了。
cpp
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1) return 0;
int cur=0,next=0,res=0;
for(int i=0;i<nums.size();i++){
next=max(next,nums[i]+i);
if(i==cur){
if(cur!=nums.size()-1){
res++;
cur=next;
if(cur>=nums.size()-1)
break;
}
else break;
}
}
return res;
}
};
接下来是思维的考验了。