665. 非递减数列
问题描述
-
给你一个长度为
n
的整数数组nums
,请你判断在 最多 改变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 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
提示:
n == nums.length
1 <= n <= 104
-105 <= nums[i] <= 105
解题思路与代码实现
class Solution {
public boolean checkPossibility(int[] nums) {
int count = 0; // 记录改变元素的次数
int i = 0;
while ( i < nums.length) {
// 在右侧元素存在的条件下,判断当前元素是否大于其右侧元素,是则需要修改
if (i + 1 < nums.length && nums[i] > nums[i + 1]) {
// 需要修改次数 + 1
count++;
// 最多1次机会修改
if (count > 1) {
return false;
}
// i右移一位后
i++;
// i右移一位后右边无元素
if (i >= nums.length - 1) {
// 当前下标i的元素上调即可将该数组变成一个非递减数列
nums[i] = nums[i - 1];
return true;
} else { // i右移一位后右边有元素
// 毕竟i左右两侧元素大小
if (nums[i + 1] >= nums[i - 1]) {
// 当前下标i的元素上调
nums[i] = nums[i - 1];
} else {
// 当前下标i-1的元素下调
nums[i - 1] = nums[i];
// 下调可能破坏数组的非递减性,需要进行判断,当此次调整无效,则不可实现
if (i >= 2 && nums[i - 2] > nums[i - 1]) {
return false;
}
}
}
}else {
i++;
}
}
// 最多1次机会
return count <= 1;
}
}