代码随想录算法训练营第三十六天 | LeetCode 122、55、45


前言

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;
    }
};

总结

贪心算法的买股票问题,跳跃游戏问题的思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值