665.非递减数列
思路
首先要明确最多只能修改一个元素。当元素呈现递减趋势时需要修改,而当递减数组大小超过2时,例如 [ 3 , 2 , 1 ] ,至少要修改2次不符合题意。但这样做还不够
本题唯一的易错点就在这,
如果将nums[i]缩小,可能会导致其无法融入前面已经遍历过的非递减子数列;
如果将nums[i + 1]放大,可能会导致其后续的继续出现递减;
所以要每次连续看3个元素,所谓瞻前顾后:
需要尽可能不放大nums[i + 1],这样会让后续非递减更困难;
如果缩小nums[i],但不破坏前面的子序列的非递减性;
代码实现
class Solution { public: bool checkPossibility(vector<int> &nums) { if (nums.size() == 1) return true; bool flag = nums[0] <= nums[1] ? true : false; // 标识是否还能修改 // 遍历时,每次需要看连续的三个元素 for (int i = 1; i < nums.size() - 1; i++) { if (nums[i] > nums[i + 1]) // 出现递减 { if (flag) // 如果还有修改机会,进行修改 { if (nums[i + 1] >= nums[i - 1]) // 修改方案1 nums[i] = nums[i + 1]; else // 修改方案2 nums[i + 1] = nums[i]; flag = false; // 用掉唯一的修改机会 } else // 没有修改机会,直接结束 return false; } } return true; } };