一 题目描述
给你一个长度为 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 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
二 方法代码
首先,本题题意是希望这是一个逐步递增的数组(记得去看第四项内容)
要点一:
如果出现两个nums[i] > nums[i+1] 的情况,那一定是无法修改一次就可以的。即便是nums[i] > nums[i+1] > nums[i+2],也不行,这三项数字中,修改某一项数字无法改变其他两项的大小关系。
因此,可以引入一个计数器,统计出现 nums[i] > nums[i+1] 的次数,如果大于1则直接返回false
要点二:
当出现 nums[i] > nums[i+1] 时,判断能不能修改一项数字满足题意,只需要注意修改的数字满足以下关系:修改项的前一项不能大于修改项的后一项,比如修改项为第三项, 那么第二项不能大于 第四项,因为无论怎么修改第三项,都改变不了第二项和第四项的大小关系,而题意要求为递增数组,第二项和第四项已经不满足了。
有以下两种修改思路
1.修改nums[i]
但需要注意的是,nums[i - 1] 不能大于 nums[i+1], 比如【3,4,2,3】,即无论怎么修改nums[i],都改变不了nums[i - 1] 和 nums[i+1]的大小关系,但如果是 i = 0的时候,是可以满足的,因为不存在 i - 1,比如【4,2,3】
2.修改nums[i + 1],
但需要注意的是,nums[ i ] 不能大于 nums[i+2], 比如【5,7,1,8】,即无论怎么修改nums[i + 1],都改变不了nums[ i ] 和 nums[i + 2]的大小关系,但如果是 i = nums.length - 2 的时候,是可以满足的,因为不存在 i + 1,比如【5,7,1】
-
方法一
public boolean checkPossibility(int[] nums) {
//计数器,统计出现 nums[i] > nums[i+1] 的次数
int greater = 0;
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] > nums[i+1]){
greater++;
//排除掉开头 (没有i-1) 和倒数第二个 (没有i+2) 的情况
if(i != nums.length-2 && i != 0){
if(nums[i] > nums[i+2] && nums[i-1] > nums[i+1]){
return false;
}
}
}
}
if(greater > 1){
return false;
}else{
return true;
}
}
三 运行结果
四 官方思路优化
感谢评论区大佬的分享,评论区大佬的链接
就是说,在修改nums[i]时,nums[i] 应该修改为大于等于前一项且小于等于后一项的最小值,即nums[i] =
nums[i - 1]
在修改nums[i]时,nums[i + 1] 应该修改为大于等于nums【i】的最小值,即nums[i + 1] =
nums[i]