题目:
思路,我们只要抽象出改变的条件,并且对改变次数做出统计,只要改变的次数大于 1 ,那么返回false;
改变的条件
现在有 三个 数字 a,b,c
现在已知 a <= b,但是b > c (exp:1,2,0)
那么 b ,c 就是一个递减数列了,所以我们需要做出改变,让他变成非递减数列,
那么我们现在就要对比 a 和 c
如果 a > c(exp:3,4,2),那么我们就得让 c 变成 b,让序列变成 a , b ,b (exp:3,4,4)这是非递减序列了。
如果 a <= c (exp : 1,3,1或者 1,3,2)让 b 变成 a 即可
那么我们先保存 b 的值,直接让 b 变成 a ,因为无论怎么样都要比较 a 和
c ,然后a > c,我们让b等于自己原来的值,再让c 等于 b,如果a <= c,那么就不处理了。
(如果 此时 a为0号下标元素 b为1号下标元素,a > b直接让 a = b即可)
class Solution {
public boolean checkPossibility(int[] nums) {
if(nums.length < 3) return true;
int number = 0;//统计改变次数
for(int i = 0 ; i < nums.length-1;i++){
//改变次数 > 1就直接返回
if(number > 1) return false;
//此时 b > c ,b之前的序列都是 小于 b 的
if(nums[i] > nums[i+1]){
int temp = nums[i];//保存b的值
if(i >= 1){
nums[i] = nums[i-1];
}else{ //如果是第一个和第二个元素进行比较,那么就直接等于第二个元素即可
nums[i] = nums[i+1];
}
if(nums[i] > nums[i+1]){
nums[i] = temp;
nums[i+1] = temp;
}
number++;
}
}
return number <= 1;
}
}