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

LeetCode 1833: Maximum Ice Cream Bars

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

基本資料
#

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

  • 提交紀錄:Accepted ×2(排序版、計數排序版)

解題思路
#

要買最多個,就從最便宜的開始買(交換論證:任何買法裡,把一個貴的換成沒買的便宜的,個數不變、花費不增)。

題目要求用計數排序:價格最多 10^5,數每個價格有幾個,由小到大走,每個價格買 min(cnt, coins // price) 個。錢不夠買目前價格時,後面更貴的也買不起,可以直接停。這是 Greedy 模板一。

我的解法
#

第一版用 sort() 一個一個買;第二版照題目要求改成計數排序:

class Solution:
    def maxIceCream(self, costs: List[int], coins: int) -> int:
        cnt = [0] * (max(costs) + 1)
        for c in costs:
            cnt[c] += 1
        bought = 0
        for price in range(1, len(cnt)):
            if price > coins:
                break
            take = min(cnt[price], coins // price)
            coins -= take * price
            bought += take
        return bought

複雜度
#

時間 O(n + M),M 是最高價格,空間 O(M)。

要特別避免的錯誤
#

  • 同一個價格不一定能全部買下,要取 min(cnt, coins // price)。

面試口說整理
#

從最便宜的買起,個數一定最多。題目要求計數排序,所以我數每個價格的數量,由小到大每個價格能買多少就買多少,錢不夠目前價格就停。時間 O(n + M)。

相關文章

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 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 3961: Maximize Sum of Device Ratings
·1 分鐘
LeetCode Medium Greedy Sorting Matrix
LeetCode 3961 解題筆記:除了一台以外,每台把最小的單位捐給同一台;那台的評分變成全域最小值,挑第二小值最小的那台當接收者