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
}
|