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

LeetCode 3914: Minimum Operations to Make Array Non Decreasing

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

基本資料
#

難易度: medium 第一次嘗試:2026-04-26

  • 提交紀錄:Accepted(一次通過)

解題思路
#

看相鄰差值 d[i] = nums[i] - nums[i - 1],目標是每個 d[i] >= 0。對 [l, r] 加 x:

  • d[l] 變大 x(如果 l > 0)。
  • d[r + 1] 變小 x(如果 r + 1 < n)。
  • 中間的差值不變。

所以一次操作最多讓一個差值變大 x。每個下降 nums[i - 1] - nums[i] > 0 都至少要補那麼多,總和是下界。而對後綴 [i, n - 1] 加,剛好只補 d[i]、不弄壞別的,達到下界。這是 Greedy 模板五。

我的解法
#

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        return sum(max(0, nums[i - 1] - nums[i]) for i in range(1, len(nums)))

我當時從右往左用 while 迴圈累加下降量,做的是同一件事。

複雜度
#

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

要特別避免的錯誤
#

  • 不需要真的模擬加法;只看相鄰差值就能算出答案。

面試口說整理
#

對一段區間加 x,只會讓它左邊界的差值變大 x,所以每個下降至少要花它的大小。對後綴加剛好只補一個下降,所以答案就是所有下降量的總和。時間 O(n)。

相關文章

LeetCode 3555: Smallest Subarray to Sort in Every Sliding Window
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 3555 解題筆記:每個長度 k 的視窗都是一次 LeetCode 581;n 只有 1000,對每個視窗跑 O(k) 的兩次掃描即可
LeetCode 581: Shortest Unsorted Continuous Subarray
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 581 解題筆記:從左往右記最大值,最後一個比最大值小的位置是右界;從右往左記最小值,最後一個比最小值大的位置是左界
LeetCode 1877: Minimize Maximum Pair Sum in Array
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 1877 解題筆記:排序後最小配最大、次小配次大,對撞指針取配對和的最大值
LeetCode 3810: Minimum Operations to Reach Target Array
·1 分鐘
LeetCode Medium Greedy Hash-Table Array
LeetCode 3810 解題筆記:一次操作會把某個值的所有位置都改對,所以答案是不相等的位置上有幾種不同的值
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分