前言
LeetCode题目:LeetCode 122、55、45
Takeaway:贪心算法,贪心很多都是记住这个思路
一、122
买股票问题,本题的贪心思路重点在于,不要考虑整体,而是考虑每天的收益,将连续的股票价格变化看成每天股票价格的变化,这样我们只要找到价值增加的两天就可以加入答案中。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans=0;
vector<int> earn; //记录每两天之间,股票价格的变化是赚多少还是亏多少
for(int i=1; i<prices.size(); i++){ //统计价格每天的变化
earn.push_back(prices[i]-prices[i-1]);
}
for(int i=0;i<earn.size(); i++){ //找到价格变化为赚钱的加入答案
if(earn[i]>0){
ans += earn[i];
}
}
return ans;
}
};
二、55
跳跃游戏,贪心思路为用一个变量cover记录当前能走到的最远纪距离,然后每次移动的时候都判断是否增加cover,如果最后cover能到终点,那就是可以覆盖。
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
int range;
//边界处理
if(nums.size() == 1){
return true;
}
for(int i=0; i<nums.size(); i++){
//当前位置可以到达
if(i <= cover){
//当前位置往后能走多少步
range = nums[i];
//将能到达的位置都用cover标记
if(i+range>cover){
cover = i + range;
}
}
}
//cover覆盖最后一个节点
if(cover >= nums.size()-1){
return true;
}else{
return false;
}
}
};
三、45
也是跳跃游戏题,难度在上一题之上,大致思路和上一题一样,需要用一个cover来记录当前最远能走到哪,但是不同之处是加入了next_cover,也就是下一步最多可以走到哪。整体逻辑就是:找到cover位置,在 i 移动到 cover 之前时,时刻检查是否需要更新next_cover(因为新的节点可能走的更远),当走到cover时,说明这是目前能1步走到的最远距离,如果没有到达终点,那么一定要再走一步,此时cover变成next_cover,然后再重复 : i 移动到 cover 之前时。。。
class Solution {
public:
int jump(vector<int>& nums) {
int ans = 0;
int cover = 0;
int next_cover = 0;
for(int i=0; i<nums.size(); i++){
//在抵达cover前,又多了一个节点,next_cover可能会变大
next_cover = max(next_cover, i+nums[i]);
//到达1步能走的最大距离
if(i == cover){
if(i >= nums.size()-1){ //走到终点了
break;
}else{ //没走到终点,一步最多就能走这么多,还得夺走一步
cover = next_cover;
ans++;
}
}
}
return ans;
}
};
总结
贪心算法的买股票问题,跳跃游戏问题的思路。