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

LeetCode 3075: Maximize Happiness of Selected Children

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

基本資料
#

難易度: medium 第一次嘗試:2024-03-10

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

解題思路
#

每選一個人,其他還沒選的都減 1,所以第 i 個(從 0 開始)被選的人實際貢獻 max(happiness - i, 0)。要總和最大就由大到小選(Greedy 模板一):大的先選扣得少,而且減到 0 之後就不會再變負。

我的嘗試
#

2024 年比賽時一次 AC,就是排序後由大到小選。

正確解法
#

class Solution:
    def maximumHappinessSum(self, happiness: List[int], k: int) -> int:
        happiness.sort(reverse=True)
        return sum(max(h - i, 0) for i, h in enumerate(happiness[:k]))

複雜度
#

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

要特別避免的錯誤
#

  • 減到 0 為止,不會變成負的。
  • 答案可能很大,但 Python 不會溢位。

面試口說整理
#

第 i 個被選的人會被扣 i,所以我由大到小排序取前 k 個,每個貢獻它減掉 i 和 0 的較大值,加總就是答案。時間 O(n log n)。

相關文章

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 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 3074: Apple Redistribution into Boxes
·1 分鐘
LeetCode Easy Array Greedy Sorting
LeetCode 3074 解題筆記:箱子可以隨便分,所以從容量最大的箱子開始拿,總容量夠裝所有蘋果就停
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個
LeetCode 2335: Minimum Amount of Time to Fill Cups
·1 分鐘
LeetCode Easy Array Greedy Sorting Heap-Priority-Queue
LeetCode 2335 解題筆記:答案是 max(最多的那種, ceil(總數 / 2));模擬的話每秒從最多的兩種各裝一杯
LeetCode 2357: Make Array Zero by Subtracting Equal Amounts
·1 分鐘
LeetCode Easy Array Hash-Table Greedy Sorting
LeetCode 2357 解題筆記:每次操作會讓最小的正數那一群變成 0,所以次數就是不同的正數有幾種