题目:
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-decreasing-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例:
思路:
p=0;
在出现 nums[p] > nums[p+1] 时,需要考虑的是应该修改数组的哪个数,使得本次修改能使 p+1 之前的数组成为非递减数组,并且 不影响后续的操作 。
优先考虑令 nums[p] = nums[p+1],因为如果修改 nums[p+1] = nums[p] 的话,那么 nums[p+1] 这个数会变大,就有可能比 nums[p+2] 大,从而影响了后续操作,例如{5,3,4,6,7};
还有一个比较特别的情况就是 nums[p+1] < nums[p-1],修改 nums[p] = nums[p+1] 不能使数组成为非递减数组,只能修改 nums[p+1] = nums[p] ,例如
{2,3,3,4,2}。
代码:
class Solution {
public boolean checkPossibility(int[] nums) {
//可以改变元素的次数
int flag = 1;;
//指向元素的指针
int p = 0;
while (flag >= 0 && p < nums.length - 1) {
//如果前面的元素小于后面的元素,遍历下一个元素
if (nums[p] <= nums[p+1]) {
p++;
continue;
}
//否则,有两种情况
//1. 如果p+1的值小于p-1的值,就需要将p的值赋给p+1的值
//2. 正常情况就是将p+1的值赋给p的值,因为这样可以保证前面的数是小的。
if (p - 1 >= 0 && nums[p+1] < nums [p-1]) {
nums[p+1] = nums[p];
} else {
nums[p] = nums[p+1] ;
}
flag --;
p++;
}
if (flag < 0) {
return false;
}
return true;
}
}
时间复杂度:O(n),空间复杂度:O(1)