LC 665非递减数列

题目描述:

难度虽然是简单,但是这道题通过率比较低。要注意一些特别的情况!

在例子(1),我们发现2比4小,于是我们修改前面的值,让其等于2,这样就是一个非递减的数列。

举一个例子(2):1,2,3,5,4,5,6,7...

在这个例子里,和例子1差不多,我们把4改成5就好了。

再举一个例子(3):

-1,2,4,5,3,6,7...

我们发现,我们只需要让3改成5就可以让这个数列变成一个非递减。

比较上面例子:当我们发现有一个数比前一个数小的时候,我们既可以改变当前数字例子(3),也可以改变当前数字的前一个数字(例子1和2)。

那么到底要改哪个数字的规律呢,我们发现,当我们找到一个出问题的数字(让数列不处于非递减数列)时,还要比较一下这个数字和前第二个数字的大小。如果大于等于,则只需改当前数字,否则就改当前数字的前一个数字。

代码如下:

class Solution {
    public boolean checkPossibility(int[] nums) {
//   4   2   3  改4 --2
//   1   2   4   3   5   改4  --- 3
//   -1   3   3   4   2  5   改2----4

if (nums.length<=1||nums==null){
    return true;
}

int res=0;
for(int i=1;i<nums.length&&res<2;i++){
    if(nums[i-1]<=nums[i]){
        continue;
    }

    //不是非递减
    res++;
    if(i-2>=0){
        if(nums[i]<nums[i-2]){
            nums[i]=nums[i-1];
        }
        else {
            nums[i-1]=nums[i];
        }
    }
}
return res<=1;

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值