难度简单
给你一个长度为 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
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
此题为找规律题目,根据以下三个例子,可以发现以下规律,
==================================================
例一:4,2,3
例二:-1,4,2,3
例三:2,3,3,2,4
==================================================
[1]有时候需要修改前面较大的数字(比如前两个例子需要修改4),
[2]有时候却要修改后面较小的那个数字(比如前第三个例子需要修改2),
==================================================
我们判断修改那个数字其实跟再前面一个数的大小有关系,即nums[i -2] 和 nums[i]之间的大小关系,
1.首先如果nums[i -2] 不存在,比如例子4,2,3中,4前面没有数字了,我们直接修改前面的数字为当前的数字2即可。
2.当nums[i -2] < nums[i]时,比如例子-1,4,2,3中,-1小于2,我们还是需要修改前面的数字4为当前数字2;
3.当nums[i -2] >= nums[i]时,比如例子2,3,3,2,4中,3大于2,我们需要修改当前数2为前面的数3。
class Solution {
public boolean checkPossibility(int[] nums) {
if(nums == null || nums.length <= 1)
return true;
int cnt =0;
for(int i=1; i<nums.length;i++){
if(nums[i-1] <= nums[i]){
continue;
}
cnt++;
if(i - 2 >= 0 && nums[i -2] > nums[i]){//如果nums[i -2] > nums[i],比如例子2,3,3,2,4中,3大于2,我们需要修改数2为其前面的数3。
nums[i] = nums[i-1];
}
else{ //当nums[i -2] <= nums[i],比如例子-1,4,2,3中,-1小于2,我们还是需要修改前面的数字4为当前数字2;
nums[i-1] = nums[i];
}
}
if(cnt <= 1)
return true;
else
return false;
}
}