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

LeetCode 2838: Maximum Coins Heroes Can Collect

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

基本資料
#

難易度: medium 第一次嘗試:2026-02-10

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

解題思路
#

英雄能打贏所有強度 <= 自己的怪物,而且每隻怪物的金幣都拿得到。所以每個英雄的答案是「強度 <= 英雄的怪物的金幣總和」。

  1. 把 (怪物強度, 金幣) 依強度排序。
  2. 建金幣的前綴和。
  3. 每個英雄用 bisect_right 找到第一隻打不贏的怪物位置 idx,答案是 prefix[idx]。

我的解法
#

import bisect

class Solution:
    def maximumCoins(self, heroes: List[int], monsters: List[int], coins: List[int]) -> List[int]:
        pairs = sorted(zip(monsters, coins))
        powers = [p for p, _ in pairs]
        prefix = [0]
        for _, c in pairs:
            prefix.append(prefix[-1] + c)
        return [prefix[bisect.bisect_right(powers, h)] for h in heroes]

用 bisect_right 是因為強度等於英雄的怪物也打得贏。

複雜度
#

時間 O((n + m) log m),空間 O(m)。

要特別避免的錯誤
#

  • 用 bisect_left:強度剛好相等的怪物會被漏掉。
  • 對每個英雄重新加總:O(n * m)。
  • 怪物和金幣分開排序:兩個陣列的對應關係會亂掉,要 zip 在一起排。

面試口說整理
#

每個英雄的答案是強度不超過他的怪物的金幣總和。我把怪物和金幣綁在一起依強度排序,建金幣前綴和,然後每個英雄用 bisect_right 找到第一隻打不贏的怪物,前綴和就是答案。時間 O((n + m) log m)。

相關文章

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 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 3814: Maximum Capacity Within Budget
·1 分鐘
LeetCode Medium Binary-Search Sorting Prefix-Sum
LeetCode 3814 解題筆記:依成本排序加上前綴最大容量,每台機器用 bisect 找能搭配的最貴機器
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 2054: Two Best Non-Overlapping Events
·1 分鐘
LeetCode Medium Dynamic-Programming Binary-Search Sorting Heap
LeetCode 2054 解題筆記:只能選兩個,所以對每個活動,加上「在它開始前就結束的活動裡價值最大的」;依結束時間排序,前綴最大值 + 二分搜尋
LeetCode 3323: Minimize Connected Groups by Inserting Interval
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 3323 解題筆記:先合併區間;新區間能把第 l 到 r 組連起來 ⇔ 第 r 組的起點 − 第 l 組的終點 <= k;滑動視窗找一次能連起來最多組