leetcode #665 非递减数列 javascrpit有图简单易懂

leetcode非递减数列

题目:

给你一个长度为 n 的整数数组,请你判断在 最多 改变 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
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。

这题还是比较坑的,开始想得很简单,就是找数组里有没有一个以上的递减的地方就行了。可是一看这题的通过率很低啊十万次里只有两万通过的,就想这里一定有坑啊,果不其然,发现有这样的例子:[1, 3, 0, 0],只有一个地方递减但是只改变一个元素不行。于是我就想了想这题的本质是什么,最后抽象了一下,就是找错误的山峰峡谷的个数。

山峰
                  山峰

峡谷
                 峡谷
于是有了以下代码 (javascript)

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var checkPossibility = function(nums) {
    let range = 0;
    let temp; 
    if(nums.length <= 2)
        return true;
    temp = -1 * Math.pow(10, 5); //第一个最小的方便迭代
    for(let i = 0; i < nums.length - 1; i++)
    {
        if(nums[i] > nums[i + 1])
        {
            if(nums[i + 1] >= temp)
                range++;
            else
            {
                if(i + 2 > nums.length - 1 || nums[i + 2] >= nums[i])
                    range++;
                else
                    return false;
            }
        }
        else
            temp = nums[i];
        if(range > 1)
            return false;
    }
    return true;
};

时间复杂度为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值