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

LeetCode 1402: Reducing Dishes

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

基本資料
#

難易度: hard 第一次嘗試:2026-07-08

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

解題思路
#

選定要做的菜之後,滿意度大的放後面,總和最大(排序不等式)。所以排序後,選的一定是最大的那幾道。

從滿意度最大的開始,一道一道往前加。每加一道新的菜放在最前面,原本選的菜全部往後一格,各多乘一次:

新的總和 = 舊的總和 + (目前選的所有菜的滿意度總和,包含新的這道)

只要「目前選的滿意度總和」還是正的,加上去就會變大;變成 <= 0 就停。

我的解法
#

class Solution:
    def maxSatisfaction(self, satisfaction: List[int]) -> int:
        satisfaction.sort(reverse=True)
        total = suffix = 0                         # suffix:目前選的滿意度總和
        for s in satisfaction:
            suffix += s
            if suffix <= 0:
                break
            total += suffix                        # 前面選的都往後一格
        return total

我 AC 的版本是反過來做:先把全部都選、算出總和,再從最小的開始一道一道拿掉,每拿掉一道總和減少「剩下的總和」,取過程中的最大值。兩種是同一件事。

複雜度
#

時間 O(n log n),空間 O(1)(不算排序)。

要特別避免的錯誤
#

  • 只挑正的菜:負的菜放最前面,可以讓後面的菜都多乘一次,有時候反而更好。例如 [-1, -8, 0, 5, -9] 的答案 14 就用了 -1。

面試口說整理
#

選定的菜一定是滿意度大的放後面,所以選的是最大的幾道。我從最大的開始往前加,每加一道放在最前面,前面選的都往後一格,總和增加目前選的滿意度總和,只要這個總和是正的就繼續加。時間 O(n log n)。

相關文章

LeetCode 1526: Minimum Number of Increments on Subarrays to Form a Target Array
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 1526 解題筆記:從左往右看,每次比前一個高,多出來的高度都要新開那麼多次操作;變矮的部分可以沿用之前的操作
LeetCode 1537: Get the Maximum Score
·2 分鐘
LeetCode Hard Dynamic-Programming Two-Pointers Greedy Array
LeetCode 1537 解題筆記:兩個排序陣列只在共同的值可以換路;雙指針合併,兩條路各自累加,遇到共同的值時兩邊都取較大的那個再加上它
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 757: Set Intersection Size At Least Two
·1 分鐘
LeetCode Hard Greedy Sorting
LeetCode 757 解題筆記:按右端點排序(同右端點時左端點大的先),只記最右邊兩個點;沒蓋到就放右端兩點,只蓋到一個就補右端點
LeetCode 1147: Longest Chunked Palindrome Decomposition
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Two-Pointers Rolling-Hash String
LeetCode 1147 解題筆記:從兩端同時往內累積字串,左右一相等就切成一對;越早切越好,剩下的中間(如果有)算一塊
LeetCode 3651: Minimum Cost Path with Teleportations
·2 分鐘
LeetCode Hard Dynamic-Programming Grid-Dp Matrix Array
LeetCode 3651 解題筆記:一層一層算傳送次數;傳送到某格的成本是上一層「值 >= 它的格子」的最小值,排序後用前綴最小值求,再跑一次右 / 下的 Grid DP