0665. Non-decreasing Array (M)

Non-decreasing Array (M)

题目

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 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:

  • n == nums.length
  • 1 <= n <= 10^4
  • -105 <= nums[i] <= 10^5

题意

给定一个数组,判断能否通过改变其中一个或零个数,使整个数组构成非递减序列。

思路

遍历数组,找到第一个i,使得 nums[i] > nums[i+1],这时我们尝试进行修复,有两种情况,要么改变nums[i],要么改变nums[i+1]:(1) i - 1 >= 0 且 nums[i-1] > nums[i+1],这时为了保证非递减,必须使 nums[i+1] = nums[i]; (2) i == 0 或者 nums[i-1] <= nums[i+1] 时,为了在之后的遍历中尽可能保证非递减,nums[i+1]必须尽可能的小,所以使 nums[i] = nums[i+1]。完成修复后,我们已经保证了子数组 [0 ~ i+1] 是一个非递减序列,且已经动用了唯一的修改机会,只要继续向后遍历判断是否仍存在 nums[j] > nums[j+1] 的情况即可。


代码实现

Java

class Solution {
    public boolean checkPossibility(int[] nums) {
        boolean found = false;
        for (int i = 0; i + 1 < nums.length; i++) {
            if (nums[i] > nums[i + 1]) {
                if (found) return false;
                found = true;
              	// 因为只有改变nums[i+1]才会影响之后的遍历,可以省略改变nums[i]的情况
                if (i > 0 && nums[i - 1] > nums[i + 1]) nums[i + 1] = nums[i];
            }
        }
        return true;
    }
}
原文地址:https://www.cnblogs.com/mapoos/p/14729677.html