【LeetCode】 665.非递减数列

题目:
在这里插入图片描述
思路,我们只要抽象出改变的条件,并且对改变次数做出统计,只要改变的次数大于 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值