leetcode练习题一:判断能否变成递减数列

给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]

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

示例 2:输入: [4,2,1]
输出: False
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
说明: n 的范围为 [1, 10,000]。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* 判断改变一个值是否能变成递增
*
* @param arr 3 2 1, 1 2 1
* @return
*/
private Boolean changeOneToUp(int arr[]) {
Boolean flag = true;
//2个数是一定可以的
if (arr.length < 3) {
return flag;
}
//3 5 4 4 6
int count = 0;
int left, right;
for (int i = 0; i < arr.length - 1; i++) {
//第一个数没有左边的值,所以单独拿出来
if (i == 0) {
//如果第一个数大于右边,则count++
if (arr[0] > arr[1]) {
//第一个重新赋值为较小的数,因为要判断 后面的数是否小于他左边的数
arr[0] = arr[1];
count++;
}
continue;
}
left = arr[i - 1];
right = arr[i + 1];
//此时的值判断是否比右边大,count++
if (arr[i] > right) {
//左边比右边大,则此时右边的值只能最小为arr[i]
if (left > right) {
arr[i + 1] = arr[i];
} else {
//此时 arr[i],最小值范围在left-right之间,所以赋值最小值:left的值
arr[i] = left;
}
count++;
}
}
//count最大只能为1 ,才能符合条件
if (count > 1) {
flag = false;
}
return flag;
}
-------------笔者水平有限,若有错漏,欢迎指正!-------------
坚持原创技术分享,您的支持将鼓励我继续创作!