665. 非递减数列
思路:题目要求判断一个数组是否能只修改一个数就成为非递减数组。,当出现 nums[i] < nums[i - 1] 时,需要考虑的是应该修改数组的num[i]还是num[i-1],使得本次修改能使 i 之前的数组成为非递减数组,并且 不影响后续的操作 ->
优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的话,那么 nums[i] 这个数会变大,就有可能比 nums[i + 1] 大,从而影响了后续操作。还有一个比较特别的情况就是 nums[i] < nums[i - 2],修改 nums[i - 1] = nums[i] 不能使数组成为非递减数组,只能修改 nums[i] = nums[i - 1]。
所以需要分两种情况,代码如下:
class Solution {
public boolean checkPossibility(int[] nums) {
if (nums == null || nums.length <= 1) {
return true;
}
int cnt = 0;//用于记录出现这种数的次数,若出现大于一次,那么就是false
for (int i = 1; i < nums.length && cnt < 2; i++) {
if (nums[i-1] <= nums[i]) {
continue;
}
cnt++;
if (i-2>=0 && nums[i-2] > nums[i]) {
nums[i] = nums[i-1];//2,3,3,2,4
}else {
nums[i-1] = nums[i];//-1,4,2,3
}
}
return cnt <= 1;
}
}