122.买卖股票的最佳时机 II
思路
- 题目要求:
尽可能地完成更多的交易,计算你所能获取的最大利润,不能同时参与多笔交易 - 贪心思路
不管是哪几天之间股票的差,都可以换算成他们两之间每天的差之和,即day3-day1=(day3-day2)+(day2-day1),所以只要求出相邻两天的股票差(局部最优),只抛售和买进有盈利的那一天的股票就可求得最大值(整体最优)。
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
for(int i=1;i<prices.size();i++){
int k=prices[i]-prices[i-1];
if(k>0)
result+=k;
}
return result;
}
};
55. 跳跃游戏
思路
每个格子上可以跳跃的最远距离有限,那么只要求出每个格子可以覆盖的最远距离,在它能覆盖的距离上再找出一个最远距离(局部最优),依次类推,当最后覆盖距离已经超过目的地(整体最优),则满足题意。
代码实现
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=nums[0];
for(int i=0;i<=cover;i++){
cover=max(cover,i+nums[i]);
if(cover>=nums.size()-1)return true;
}
return false;
}
};
45.跳跃游戏 II
思路
这道题在上一道题的要求上又要求得到最少跳跃次数,所以重点是次数,而不是是否能到达。
整体思路和上一题相似,但局部又有不同。相似在于还是才覆盖距离上找最远距离,不一样的是需要记录次数。
解题步骤:
- 当nums数组大小为1或者为0,不需要跳跃则可以到达最后位置
- 先记录第一个格子覆盖大小cur能到达的最远距离next,如果next没有覆盖到nums.size( )-1,则更新cur为next,且跳跃次数加1
- 这里有一个易错点,当next覆盖超过或等于nums.size( )-1,则count也要加1,因为这是下一次跳跃之后的结果
代码实现
class Solution {
public:
int jump(vector<int>& nums) {
if(nums[0]==0||nums.size()==1)return 0;
int cur=0;
int next=0;
int count=0;
for(int i=0;i<=cur;i++){
next=max(next,i+nums[i]);
if(i==cur){
if(next<nums.size()-1)count++;cur=next;
if(next>=nums.size()-1)return count+1;
}
}
return 0;
}
};
总结
贪心算法没有规律可言,见多识广,还是要多写多做。