题目
给你一个长度为 n
的整数数组 nums
,请你判断在 最多 改变 1
个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i
(0 <= i <= n-2)
,总满足 nums[i] <= nums[i + 1]
思路
从题目中可以发现,当数组 nums 的长度 小于 3 时,一定满足上述条件。
当数组 nums 长度 大于 等于 3 时,题目要求的非递减数列就不一定满足了。因此我们可以从 nums 长度 为 3 的这个角度进行分析。
假设 这 3个数 分别 为 a1, a2,a3。
此时我们取其中的一个数作为切入点进行分析,能否取a1 或a3进行分析呢?
如果我们取a1 或 a3进行分析,我们会发现,由于这2个数分别在数组的两端,在进行判断校验的时候,需要判断另2个数彼此间的大小关系,以及与当前 a1 或 a3的关系。
因此,我们取 a1 和 a3 进行分析,不合理。
当我们取a2 进行分析时,当a2 > a3,此时分析 a1 可能的情况(如果 a1 > a2 > a3 直接不满足条件)
a1 a2 a3
1 3 2
2 3 1
3 3 1
2 3 2
要满足条件,需要如下调整:
1. 当 a1 < a3,让 a2 = a3
2. 当 a1 > a3,让 a3 = a2
3. 当 a1 = a3,让 a2 = a3
综合以上可以得到:当 x 存在且 x>z,就让 z=y,否则让 y=z 当变更超过 2 次就不再满足条件
代码
public boolean checkPossibility(int[] nums) {
if(nums.length < 3){
return true;
}
int count = 0;
for(int i=0;i<nums.length-1;i++){
if(nums[i] > nums[i+1]){
count++;
if(count > 1){
break;
}
if(i-1 >=0 && nums[i-1] > nums[i+1]){
nums[i+1] = nums[i];
}else{
nums[i] = nums[i+1];
}
}
}
return count <= 1;
}