题干:
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
示例:
输入: nums = [4,2,3] 输出: true 解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
public class 非递减数列 {
public static void main(String[] args) {
int[] nums ={3,4,2,3};
System.out.println(checkPossibility(nums));
}
public static boolean checkPossibility(int[] nums) {
int count = 0;
for(int i=1;i<nums.length&&count<2;i++)
{
if(nums[i]>=nums[i-1]) continue;
count++;
if(i>=2&&nums[i]<nums[i-2]) nums[i] = nums [i-1];
else {
nums[i-1] = nums[i];
}
}
return count<=1;
}
}
当出现nums[i-1]>nums[i]时,需要考虑的是修改哪一个数,使得数组为非递减数列,并且不会影响后续的操作。那么我们需要优先考虑nums[i-1]=nums[i],因为如果我们修改nums[i]=nums[i-1]的话,nums[i]就会变大(因为此时nums[i-1]>nums[i]),就会影响后续操作,使得需要修改的位置变多。
还有一种情况是当nums[i-2]>nums[i],修改nums[i-1]=nums[i]不能使数组成为非递减数组,只能修改nums[i]=nums[i-1]。