LeetCode第665题:非递减数列

299 阅读1分钟

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

题干

给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。

我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]

实例1:

输入: nums = [4,2,3]
输出: true
解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。

思路:贪心

首先分三种情况,就是我们当前循环在1处,和大于1处1并且i>i-2,且大于1并且i<i-2(无法通过改变)

我们的初衷其实还是记录递减区间的数值,但是不同的是,我们必须要改变原数组的内容,在改变元素的基础上,再去判断,就像

3423这组数,我们不能直接通过递减区间的个数,而是要在修改后的基础上再去判断,3423改为3443,再向后遍历,发现还有递减区间,返回false。

执行用时:96 ms, 在所有 JavaScript 提交中击败了65.07%的用户

内存消耗:40.4 MB, 在所有 JavaScript 提交中击败了81.13%的用户

  var checkPossibility2 = function (nums) {
    let length = nums.length
    let decrementCount = 0
    for (let i = 1; i < length; i++) {
      if (nums[i] >= nums[i - 1]) {
        continue
      }
      decrementCount++;
      if (decrementCount > 1) return false
      if (i == 1) {
        nums[i - 1] = nums[i]
      } else if (i > 1) {
        if (nums[i] >= nums[i - 2]) {
          nums[i - 1] = nums[i]
        } else {
          nums[i] = nums[i - 1]
        }
      }
    }
    return true
  };