问题描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 n 道菜,第 i 道菜的售价为 wi。
小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。
小C想知道,自己最多可以点多少道菜?
测试样例
样例1:
输入:
m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
输出:3
样例2:
输入:
m = 4, w = [1, 2, 4, 4, 4]
输出:3
样例3:
输入:
m = 5, w = [5, 5, 5, 5, 6, 7, 8]
输出:4
问题理解
这道题需要求出售价低于特定值的数出现次数的最大值,那么我们通过一次遍历,在遍历时记录当前售价出现的次数,并不断更新最大出现次数,就可以得到答案。 基本的方法已知了,那么,有什么简便写法呢?
别样的尝试
我们知道,在python中存在着字典这一数据结构,存放了相应的键值对,并且对于字典,有一个Counter子类专门用于计数,既然我们已经有了如此方便的东西,便可以直接使用Counter,省去了前面冗余的计算每个出现次数的过程,然后直接遍历Counter,得到符合条件的数量的最大值就可以了
解题思路
-
统计价格出现次数:
- 使用
Counter(w)统计列表w中每个价格出现的次数。
- 使用
-
遍历统计结果:
- 遍历
Counter对象中的键值对,其中k是价格,v是该价格出现的次数。
- 遍历
-
筛选符合条件的价格:
- 对于每个价格
k,检查它是否不超过上限m。
- 对于每个价格
-
更新最大数量:
- 如果价格
k不超过上限m,则更新最大数量ans,使其等于当前最大数量和该价格出现次数v中的较大值。
- 如果价格
- 时间复杂度:O(n)
- 空间复杂度:O(n)
其中 n 是列表 w 的长度。
题目总结
在这个题目中,我们需要计算小C在餐馆中最多可以点多少道价格相同的菜,且这些菜的价格不能超过给定的上限 m。为了高效地解决这个问题,我们使用了 collections 模块中的 Counter 类来简化统计过程。
数据结构选择
Counter 是一个非常有用的工具,它能够自动统计列表中每个元素的出现次数。在这个问题中,我们使用 Counter 来统计每种价格出现的次数。这样,我们就可以通过遍历 Counter 对象中的键值对,快速找到符合条件的价格,并计算出最多可以点的菜的数量。
通过使用 Counter,我们能够高效地统计每种价格出现的次数,并快速找到符合条件的价格。这种方法不仅简化了代码,还提高了算法的效率。最终,我们能够在 O(n) 的时间复杂度和 O(n) 的空间复杂度内解决这个问题。