Leetcode 665 非递减数列
问题重述
给你一个长度为n的整数数组,请你判断在最多改变1个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的:对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。(每两个数都是非递减的)
示例 1:
输入: nums = [4,2,3] 输出: true
解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
示例 2:
输入: nums = [4,2,1] 输出: false
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
思路
需要考虑三种基础情况
1)如果发现有两个连续的递减数列直接return 0,即出现432这种。
2)如果出现442这种情况,需要修改2
3)如果出现143这种情况,需要修改3.说明还需要比较nums[i-2]和nums[i]的大小。
最终代码
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int n = nums.size(), cnt = 0;
if (n == 1 || n == 2) return 1;
for (int i = 1; i < n; i++) {
if (nums[i] < nums[i-1]) {
cnt++;
if (cnt >= 2) return 0;
if (i - 2 >= 0 && nums[i-2] > nums[i]) {
nums[i] = nums[i-1]; //如果出现442这种情况就需要修改2
} else nums[i-1]= nums[i]; //如果出现143这种情况就需要修改4
}
}
return 1;
}
};