目录

1
2
3
4
5
6
7
8
9
title: "665非递减数列"
date: 2020-07-28T22:55:18+08:00
keywords: 
- leetcode
- 数组
- hugo
- blog
categories: ["leetcode", "数组"]
draft: false

665. 非递减数列

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

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

示例 1:

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

示例 2:

1
2
3
输入: nums = [4,2,1]
输出: false
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。

说明:

1
2
1 <= n <= 10 ^ 4
- 10 ^ 5 <= nums[i] <= 10 ^ 5

解题思路

1
2
3
遍历数组,初始count = 0,如果当前元素值比它下一个元素值大,则count += 1,当count > 1时,直接返回false。
另外,在遍历数组的过程中,如果遇到 “特殊情况”,可以直接返回false;当循环正常结束则返回true

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func checkPossibility(nums []int) bool {
	if len(nums) == 1 {
		return true
	}
	var count int = 0
	for index, value := range nums {
		if index == 0 {
			continue
		}
		if value < nums[index-1] {
			count += 1
		}
		if count > 1 {
			return false
		}
	}

	return true
}

但是!!!

1
2
3
4
5
6
7
8
提交后,运行过程

输入:
[3,4,2,3]
输出
true
预期结果
false

所以要考虑特殊情况

1
现在就需要nums[i-2] <= nums[i-1] > nums[i] <= nums[i+1]这个条件了

最终代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func checkPossibility(nums []int) bool {
	if len(nums) <= 2 {
		return true
	}
	var count int = 0
	for index, value := range nums {
		if index == 0 {
			continue
		}
		if value < nums[index-1] {
			count += 1
			if nums[index-1] > nums[index+1] && nums[index-2] > value {
				return false
			}
		}
		if count > 1 {
			return false
		}
	}

	return true
}