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
  | 
 
 
给你一个长度为 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
}
  |