1.题目
Given an array nums with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element.
We define an array is non-decreasing if nums[i] <= nums[i + 1] holds for every i (0-based) such that (0 <= i <= n - 2).
-
Example 1:
- Input: nums = [4,2,3]
- Output: true
Explanation: You could modify the first 4 to 1 to get a non-decreasing array.
-
Example 2:
- Input: nums = [4,2,1]
- Output: false
Explanation: You can’t get a non-decreasing array by modify at most one element.
-
Constraints:
- 1 <= n <= 10 ^ 4
- 10 ^ 5 <= nums[i] <= 10 ^ 5
2.分析:
- 1.如果出现两次下降的情况,则直接返回false。
- 2.我们始终记录当前nums[index]为当前范围0-index的最大的数,从而保证一直为升序。
- 3.当出现降序时,需要对比nums[index-2]和nums[index],以{-1,4,2,3}为例子。
- 如果nums[index]<nums[index-2],说明必须使得nums[index]变成nums[index-1],以此来保证升序。
- 如果nums[index]>nums[index-2],说明必须使得nums[index-1]小于等于nums[index]才能保证升序。
3.Code
class Solution {
public boolean checkPossibility(int[] nums) {
// 思路:找出下降的点,仅有一次机会可变换数据,每次记录当前i-1的最小满足条件,例如:{1,2} =>max[0]=1,max[1]=2,后续的数字需判断是否满足max[i-1]&×>0
if (nums == null || nums.length == 0 || nums.length == 1) {
return true;
}
// 仅有一次机会
int times = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] < nums[i - 1]) {
if (times <= 0) {
return false;
}
times--;
if (i >= 2) {
if(nums[i]<nums[i-2]){
nums[i] = nums[i - 1];
}
}
}
}
return true;
}
}