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