Given an array nums
with n
integers, your task is to check if it could become non-decreasing by modifying at most one 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 first4
to1
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:
n == nums.length
1 <= n <= 104
-105 <= nums[i] <= 105
struct Solution;
impl Solution {
fn check_possibility(nums: Vec<i32>) -> bool {
let n = nums.len();
if n < 2 {
return true;
}
let mut p: Option<usize> = None;
for i in 0..n - 1 {
if nums[i] > nums[i + 1] {
if p.is_some() {
return false;
} else {
p = Some(i);
}
}
}
if let Some(p) = p {
if p != 0 && p != n - 2 {
if nums[p - 1] >= nums[p + 1] && nums[p] >= nums[p + 2] {
return false;
}
}
}
true
}
}
#[test]
fn test() {
assert_eq!(Solution::check_possibility(vec![4, 2, 3]), true);
assert_eq!(Solution::check_possibility(vec![4, 2, 1]), false);
}