1833.雪糕的最大数量:桶排序

【LetMeFly】1833.雪糕的最大数量:桶排序

力扣题目链接:https://leetcode.cn/problems/maximum-ice-cream-bars/

夏日炎炎,小男孩 Tony 想买一些雪糕消消暑。

商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格。Tony 一共有 coins 现金可以用于消费,他想要买尽可能多的雪糕。

注意:Tony 可以按任意顺序购买雪糕。

给你价格数组 costs 和现金量 coins ,请你计算并返回 Tony 用 coins 现金能够买到的雪糕的 最大数量

你必须使用计数排序解决此问题。

 

示例 1:

输入:costs = [1,3,2,4,1], coins = 7
输出:4
解释:Tony 可以买下标为 0、1、2、4 的雪糕,总价为 1 + 3 + 2 + 1 = 7

示例 2:

输入:costs = [10,6,8,7,7,8], coins = 5
输出:0
解释:Tony 没有足够的钱买任何一支雪糕。

示例 3:

输入:costs = [1,6,3,1,2,5], coins = 20
输出:6
解释:Tony 可以买下所有的雪糕,总价为 1 + 6 + 3 + 1 + 2 + 5 = 18 。

 

提示:

  • costs.length == n
  • 1 <= n <= 105
  • 1 <= costs[i] <= 105
  • 1 <= coins <= 108

解题方法:桶排序

这道题思路很简单,就是尽可能买便宜的雪糕。主要是题目中还有这么一句“你必须使用计数排序解决此问题”,好,那就使用桶排序来解决吧。

数据范围$1\leq costs[i]\leq 10^5$,所以开辟一个长度为$100001$的数组$bin$就好,其中$bin[i]$代表价格为$i$的雪糕的出现次数。

初始化bin数组中每个元素为0 ,遍历价格数组,假设出现了价格为$t$的雪糕,就令$bin[t]$加一。

得到桶排序数组后,从$1$到$10^5$遍历$bin$桶,当剩余金币小于当前雪糕价格时结束遍历。

对于价格为$t$的雪糕(共有$bin[t]$个),剩余金币为$coins$时,一共可以购买$\min(bin[t], \lfloor\frac{coins}{t}\rfloor)$个。

  • 时间复杂度$O(n+\max{coins[i]})$
  • 空间复杂度$O(\max{coins[i]})$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* @LastEditTime: 2026-06-21 09:30:30
*/
#define MAX 100000
class Solution {
public:
int maxIceCream(vector<int>& costs, int coins) {
int bin[MAX + 1] = {0};
for (int t : costs) {
bin[t]++;
}

int ans = 0;
for (int i = 1; i <= MAX && coins >= i; i++) {
int num = min(coins / i, bin[i]);
ans += num;
coins -= i * num;
}
return ans;
}
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


1833.雪糕的最大数量:桶排序
https://blog.letmefly.xyz/2026/06/21/LeetCode 1833.雪糕的最大数量/
作者
发布于
2026年6月21日
许可协议