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

LeetCode 3961: Maximize Sum of Device Ratings

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

基本資料
#

難易度: medium 第一次嘗試:2026-06-18

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

一台設備的評分是最小的單位。把最小的單位捐出去,評分就變成第二小的值,只會變大。

  • 每台都只能捐一次,所以最多從最小值升到第二小值。
  • 收到的單位會拉低接收者的評分。把所有捐出來的單位都丟給同一台,只犧牲那一台:它的評分變成全部最小值裡最小的那個(全域最小值)。
  • 犧牲哪一台?其他台都拿到第二小值,所以犧牲的那台要選第二小值最小的。

答案是 所有第二小值的和 - 最小的第二小值 + 全域最小值。每台只有一個單位時,捐出去就變成空的(評分 0),不如不動,答案是所有單位的和。這是 Greedy 模板四的配對想法。

我的嘗試
#

第一版直接拿 unit[0] 當最小值、unit[1] 當第二小值,以為每一列已經排序。例如 [[4, 3]]:只有一台不能捐,答案是 3,這版回傳 4。

改成先找出每列的最小值、移除它,再找第二小值,就 AC 了。

正確解法
#

class Solution:
    def maxRatings(self, units: List[List[int]]) -> int:
        if len(units[0]) == 1:
            return sum(u[0] for u in units)
        global_min, total, min_second = inf, 0, inf
        for u in units:
            a, b = heapq.nsmallest(2, u)
            global_min = min(global_min, a)
            total += b
            min_second = min(min_second, b)
        return total - min_second + global_min

只有一台設備時,這個式子會得到 b - b + a = a,剛好就是不動的答案。

複雜度
#

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

要特別避免的錯誤
#

  • 輸入的每一列沒有排序,要自己找最小和第二小。
  • 每台只有一個單位時要特判。

面試口說整理
#

捐出最小的單位會讓評分升到第二小值,所以除了一台以外都捐,而且全部捐給同一台,只犧牲它。被犧牲的那台評分變成全域最小值,要選第二小值最小的那台。答案是第二小值總和減掉最小的第二小值,再加上全域最小值。時間 O(m · n)。

相關文章

LeetCode 948: Bag of Tokens
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 948 解題筆記:排序後,用最小的 token 換分數、用最大的 token 換能量;只有分數 > 0 才能換能量,換不了就停
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 3627: Maximum Median Sum of Subsequences of Size 3
·1 分鐘
LeetCode Medium Math Greedy Sorting Game-Theory Array
LeetCode 3627 解題筆記:排序後每次拿最大的兩個和最小的一個,中位數是第二大的;答案是從尾端往前每隔一個取,共 n / 3 個
LeetCode 3075: Maximize Happiness of Selected Children
·1 分鐘
LeetCode Medium Array Greedy Sorting
LeetCode 3075 解題筆記:由大到小選 k 個,第 i 個選的會被扣 i,扣到 0 為止
LeetCode 324: Wiggle Sort II
·1 分鐘
LeetCode Medium Array Divide-and-Conquer Greedy Sorting
LeetCode 324 解題筆記:排序後分成小的一半和大的一半,各自反轉後交錯放:小的放偶數位置、大的放奇數位置
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的