题目原址
https://leetcode.com/problems/non-decreasing-array/description/
题目难度
easy
题目Tag
Array
题目描述
Given an array 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 array[i] <= array[i + 1
] holds for every i
(1 <= i < n).
Example 1:
Input: [4,2,3]
Output: True
Explanation: You could modify the first 4 to 1 to get a non-decreasing array.
Example 2:
Input: [4,2,1]
Output: False
Explanation: You can’t get a non-decreasing array by modify at most one element.
Note:
The n
belongs to [1, 10,000].
解题思路
这个题想了很久,最后是看别人的博客才想到解题思路,学习的地方还是有很多啊。
大体的思路:
定义一个用于标记的变量result = false
,第一次遇到array[i] > array[i+1]
的时候,将标记值变为true
,第二次遇到array[i] > array[i+1]
时候,直接返回false
。其实就是判断array[i] > array[i+1]
是否出现两次。那么怎么判断呢??
问题的关键在于:
当遇到一个array[i] > array[i+1]
,我们是把nums[i]变为nums[i+1],还是把nums[i+1]变为nums[i]。
这里面有两种情况:
1 3 5 4 6 7 –> 1 3 4 4 6 7
这里面是5>4的情况,将nums[i]变为nums[i+1],是因为,nums[i+1]比前面的所有数字都大。1 4 5 3 6 7 –> 1 4 5 5 6 7
这里面是5>4的情况,将nums[i+1]变为nums[i],是因为,nums[i+1]比前面的数字小。
AC代码
class Solution {
public boolean checkPossibility(int[] nums) {
boolean result = false;
int length = nums.length;
for(int i = 0; i<length; i++) {
if(i+1 < length && nums[i] > nums[i+1]) {
if(result)
return false;
if(i-1 < 0 || nums[i+1] >= nums[i-1] ) {
nums[i] = nums[i+1];
}else
nums[i+1] = nums[i];
result = true;
}
}
return true;
}
}