LeetCode 665. 非递减数列

一道简单题把自己考成了傻逼。。。

 

贪心问题,随便加条件也只是个贪心问题,重要的是贪心什么;

 

这道题需要前瞻后顾,实际问题存在两种可能;

对于1,4,2,5;

对于该序列的调整无非就是两种情况:

1,2,2,5;

1,4,4,5;

可以看到两种情况都可以满足;

而对于:

1,4,2,3;

有两种调整方式:

1,2,2,3;

1,4,4,3;

可知,只可以采用第一种方式;

 

所以我们可以得到两种调整方式:

即当nums[i]>nums[i+1]时:

1.使得nums[i+1]=nums[i];

2.使得nums[i]=nums[i+1];

但是如何选择策略,必须要通过贪心思想来抉择;

由于只能改变一次,所以我们需要保证的是,要求更改一次并不会影响后面的递增序列,也就是不会将后续的递增序列破坏;

如果不会破坏后面的递增序列,我们要求更改不会破坏之前的递增序列;

 

所以判定条件只需要优先保证之后的递增序列不受影响即可,也就是使得nums[i]=nums[i+1]优先;

 

class Solution {
    public:
    bool checkPossibility(vector<int>& nums) {
        bool flag = true;
        if (nums.size() == 1)
            return true;
        if (nums[1] < nums[0])
            flag = false;
        for (int i = 1; i < nums.size()-1; i++) {
            if (nums[i+1] < nums[i]) {
                if (flag) {
                    //如果还有修改机会;
                    if (nums[i + 1] >= nums[i - 1]) {
                        nums[i] = nums[i + 1];
                    }
                    else {
                        nums[i + 1] = nums[i];
                    }
                    flag = false;
                }
                else {
                    //如果没有修改机会;
                    return false;
                }
            }
        }
        return true;
    }
};

 

posted @ 2021-02-07 17:29  暮云林凌  阅读(40)  评论(0编辑  收藏  举报