665. 非递减数列 ( 思维 / 归纳 )

这篇博客探讨了LeetCode第665题的解决方案,重点在于如何保持数列非递减。文章通过分析指出,当遇到递减时,可以通过调整相邻元素来修复。对于第二个元素,可以直接将其前一个元素设为相同值;对于其他位置的元素,根据其与前两个元素的关系决定增大前一个元素还是增大当前元素。作者提供了AC代码,并用3张动图辅助理解解题思路。
摘要由CSDN通过智能技术生成

LeetCode:665. 非递减数列

在这里插入图片描述

偏思维,需要归纳总结现象


当我们遇到递减时, 如果当前是第二位元素 i = = 1 i == 1 i==1, 则将第一位变小, 即 n u m s [ i − 1 ] = = n u m s [ i ] nums[i - 1] == nums[i] nums[i1]==nums[i]

当不是第二位元素的时候, 我们有两种方式修改, 将前一个变小,将当前的这个变大

什么时候变小,什么时候变大呢。

需要看当前 nums[i] 和 nums[i - 2] 的大小
如果 nums[i - 2] 比较小, 那么就将前一个变小, 即 nums[i - 1] = nums[i];
如果 nums[i] 比较小, 那么就将当前的这个变大, 即 nums[i] = nums[i - 1]



AC Code

class Solution {
    public boolean checkPossibility(int[] nums) {
        int len = nums.length, cnt = 0;

        for(int i = 1; i < len; i++) {
            if(nums[i] < nums[i - 1]) {
                if (i == 1 || nums[i] >= nums[i - 2]) nums[i - 1] = nums[i];
                else nums[i] = nums[i - 1];
                cnt++;
            }
            if(cnt > 1) return false;
        }

        return true;
    }
}





参考: 3 张动图帮助你理解这道题目怎么想,秒懂!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值