贪心算法补卡

376. 摆动序列

首先是对“摆动”的判断,为什么等于号要在同一边,可以在一个平坡中只计算一次左边的平坡到上坡或者下坡,为了避免两端的特殊判断,右端结束算一个坡,所以答案初始是1,在开头加上和第一个元素大小一致的头元素,漏掉了单调中包含平坡误判的情况,因为以下判断方法是每次更新predis,然后判断当前dis,如果是一次摆动就算入,因为考虑到了平坡,虽然只会梯形的平坡算入一次拐点,但是存在单调区间的拐点,也会被算进去,所以如果是在一个单调区间里面,不应该把pre改成0,造成在单调区间里峰值的误判,而是在有峰值的时候,单调的方向真的改变了,才把predis更改正负

(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)

55. 跳跃游戏

 因为可以选择步数范围内跳几步,范围就是i+nums[i],然后进一步更新最大范围

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int maxx = 0;
        for(int i = 0;i<=maxx;i++){
            if(maxx>=nums.size()-1) return true;
            maxx = max(maxx, i+nums[i]);
        }
        return false;
    }
};

45.跳跃游戏II

这里我自己做的思路和解析有些区别,这里我把return ans 放在i>premax之前,而判断return的时候返回的ans,是通过当前的maxx(也就是下一次跳跃的范围,也就是ans+1的范围)就会导致我刚开始需要ans=1, 这里我代码繁琐的主要问题是没有弄清楚ans对应的当前步数范围,还是下一步数范围

 

class Solution {
public:
    int jump(vector<int>& nums) {
        if(nums.size()<=1) return 0;
        int maxx = 0;
        int ans = 1;
        int premax = maxx;
        for(int i = 0;i<=maxx;i++){
            if(maxx>=nums.size()-1) return ans;
            if(i>premax){
                premax = maxx;
                ans++;
            }
            maxx = max(maxx, i+nums[i]);
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值