↓快轉到主要內容
  1. LeetCode/

LeetCode 665: Non-decreasing Array

·1 分鐘· ·
LeetCode Medium Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2025-07-22

  • 提交紀錄:Wrong Answer ×2 → Runtime Error ×2 → Accepted

解題思路
#

掃描時遇到 nums[i] < nums[i - 1],最多只能修一次(Array 模板二)。改哪一個?

  • 優先把 nums[i - 1] 降成 nums[i]:這樣 nums[i] 不變,對後面最有利。但前提是 nums[i - 2] <= nums[i],不然 i - 2 和 i - 1 之間又會下降。
  • 如果 nums[i] < nums[i - 2],只能把 nums[i] 拉高成 nums[i - 1],之後繼續檢查。

第二次遇到下降就回傳 False。

我的嘗試
#

版本問題
第一版只數下降了幾次。[3, 4, 1, 2] 只有一次下降,但 4 改成 1 以下會比 3 小、1 改成 4 以上會比 2 大,答案 False,這版回傳 True
第二版加了「改不好」的檢查,但條件寫成 i > 1,漏掉 i == 1,[3, 4, 1, 2] 還是 True;另外 nums[i + 2] 會超出範圍,例如 [0, 2, 4, 0]
兩次 RE改成 i >= 1,但邊界還是 i < len(nums) - 1,[3, 4, 0] 時 nums[i + 2] 超出範圍
AC邊界改成 i < len(nums) - 2

我的 AC 版本是在下降點同時看前後兩邊;這裡整理成「決定改哪一個」的寫法,比較好說明。

正確解法
#

class Solution:
    def checkPossibility(self, nums: List[int]) -> bool:
        changed = False
        for i in range(1, len(nums)):
            if nums[i] < nums[i - 1]:
                if changed:
                    return False
                changed = True
                if i >= 2 and nums[i] < nums[i - 2]:
                    nums[i] = nums[i - 1]          # 只能把 nums[i] 拉高
        return True

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 只數下降次數不夠,還要看修得修不好。
  • 往後看 i + 2 之前要確定沒超出範圍。

面試口說整理
#

我掃描陣列,遇到下降時只有一次修改的機會:能把前一個降下來就降,如果這樣會跟再前一個衝突,就把目前這個拉高。第二次遇到下降就回傳 False。時間 O(n)。

相關文章

LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 164: Maximum Gap
·1 分鐘
LeetCode Medium Bucket-Sort Radix-Sort Sorting Array
LeetCode 164 解題筆記:最大間距至少是平均間距,桶子寬度不超過它時,最大差一定在相鄰的非空桶子之間;每個桶子只記最小和最大值,O(n)
LeetCode 735: Asteroid Collision
·1 分鐘
LeetCode Medium Array Stack Simulation
LeetCode 735 解題筆記:從左到右用 stack,只有「stack 頂端往右、目前的往左」才會相撞,小的爆掉,一樣大一起爆
LeetCode 1814: Count Nice Pairs in an Array
·1 分鐘
LeetCode Medium Array Hash-Table Math Counting
LeetCode 1814 解題筆記:把條件移項成 nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]),按這個值分組數 pair,記得取模
LeetCode 3075: Maximize Happiness of Selected Children
·1 分鐘
LeetCode Medium Array Greedy Sorting
LeetCode 3075 解題筆記:由大到小選 k 個,第 i 個選的會被扣 i,扣到 0 為止
LeetCode 3070: Count Submatrices with Top-Left Element and Sum Less Than k
·1 分鐘
LeetCode Medium Array Matrix Prefix-Sum
LeetCode 3070 解題筆記:包含左上角的子矩陣就是二維前綴和 P[i][j],數有幾個 <= k