给你一个长度为 n
的整数数组 nums
,请你判断在 最多 改变 1
个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i
(0 <= i <= n-2)
,总满足 nums[i] <= nums[i + 1]
。
力扣链接:665. 非递减数列 - 力扣(LeetCode)
解法一:
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int n = nums.size();
int j = 0; // 记录需要改变的元素数量
for(int i = 1; i < n; i++){
if(nums[i] < nums[i-1]){
j++; // 找到一个需要改变的元素
if(j > 1) return false; // 如果需要改变的元素超过1个,直接返回false
if(i > 1 && nums[i] < nums[i-2]){
nums[i] = nums[i-1]; // 改变当前元素的值,使其不小于前一个元素
}
}
}
return true;
}
};
主要思想是通过找到第一个需要改变的元素,判断其前一个和后一个的大小,如果替换当前元素后,仍然前一个元素比后一个元素大,那么就给J再次加一。
实现:不在一个循环中完成当前的对J的自增操作。而是通过对当前值付一个大值,使得其在下一次循环时自动实现对J的自增。
难点:考虑边界情况,尤其是nums[0]和nums[1],以及在循环中的超限问题,核心就是如何对改变后的数组重新判断其递增性。