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)