1. 程式人生 > 實用技巧 >665. 非遞減數列

665. 非遞減數列

給你一個長度為n的整數陣列,請你判斷在 最多 改變1 個元素的情況下,該陣列能否變成一個非遞減數列。

我們是這樣定義一個非遞減數列的:對於陣列中所有的i (0 <= i <= n-2),總滿足 nums[i] <= nums[i + 1]。

示例 1:

輸入: nums = [4,2,3]
輸出: true
解釋: 你可以通過把第一個4變成1來使得它成為一個非遞減數列。

示例 2:

輸入: nums = [4,2,3]
輸出: true
解釋: 你可以通過把第一個4變成1來使得它成為一個非遞減數列。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/non-decreasing-array


思路:

在出現 nums[i] < nums[i - 1] 時,需要考慮的是應該修改陣列的哪個數,使得本次修改能使 i 之前的陣列成為非遞減陣列,並且不影響後續的操作。優先考慮令 nums[i - 1] = nums[i],因為如果修改 nums[i] = nums[i - 1] 的話,那麼 nums[i] 這個數會變大,就有可能比 nums[i + 1] 大,從而影響了後續操作。還有一個比較特別的情況就是 nums[i] < nums[i - 2],修改 nums[i - 1] = nums[i] 不能使陣列成為非遞減陣列,只能修改 nums[i] = nums[i - 1]。

class Solution {
    public boolean checkPossibility(int[] nums) {
        int cnt = 0;
        for (int i = 1; i < nums.length && cnt < 2; i++) {
            if (nums[i] >= nums[i - 1]) {
                continue;
            }
            cnt++;
            if (i - 2 >= 0 && nums[i - 2] > nums[i]) {
                nums[i] 
= nums[i - 1]; } else { nums[i - 1] = nums[i]; } } return cnt <= 1; } }