🍀非递减数列
描述:
# 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
示例 1:
输入: nums = [4,2,3]
输出: true
解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。
示例 2:
输入: nums = [4,2,1]
输出: false
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
提示:
n == nums.length
1 <= n <= 104
-105 <= nums[i] <= 105
思考:
非递减最开始我理解的是只要不是递减就可以,也就是说可以存在等于的情况,只要存在比如3,1就需要把它变成非递减(这点想了很久才想明白)。所以接下来就判断递减,也就是前一个比后一个大的情况,这种情况肯定是需要改变后一个数的值,至于变大变小,要根据数组的情况来决定。
-
i - 1 > i +1 && i > i + 1,在这种情况下为了使得序列尽可能的非递减,需要i + 1尽可能的小,把i给i + 1。
-
i - 1 < i +1 && i > i + 1,在这种情况下为了使得序列尽可能的非递减,需要i尽可能的小。
这个题费了好久的时间,算是最难的一个了到目前为止!
实现:
public class Solution {
public boolean checkPossibility(int[] nums){
if (nums == null || nums.length == 1 || nums.length == 2){
return true;
}
int change = 0;
if (nums[0] > nums[1]){
nums[0] = nums[1];
change++;
}
for (int i = 1; i < nums.length - 1 && change < 2; i++) {
if (nums[i] > nums[i + 1]){
change++;
if (nums[i - 1] > nums[i + 1]){
nums[i + 1] = nums[i];
}
}
}
if (change > 1){
return false;
}else {
return true;
}
}
}
测试一下!