from collections import Counter
def solution(m: int, w: list) -> int: # 过滤出价格不超过 m 的菜肴 filtered_prices = [price for price in w if price <= m]
# 统计每种价格的数量
price_count = Counter(filtered_prices)
# 返回数量最多的价格的数量
return max(price_count.values(), default=0) # default=0 处理空列表的情况
if name == 'main': print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3) print(solution(4, [1, 2, 4, 4, 4]) == 3) print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4)
题解解读与思路分析
在解决这一问题之前,我们首先要理解题目中给定的要求。我们需要从一组价格中筛选出那些价格不超过给定最大值 m 的菜肴,并找出在这些价格中,出现频率最高的价格数量。
问题解析
对于给定的整数 m 和一个整数列表 w(表示菜肴的价格),我们的目标是执行以下步骤:
-
筛选出可接受的价格:我们需要过滤掉所有大于
m的价格,留下那些不超过m的价格。这一步可以通过遍历列表w并进行条件判断来完成。 -
统计价格的出现频率:对于筛选出来的价格,我们需要统计每个价格出现的次数。这里,可以用 Python 的
collections.Counter来快速实现这一统计功能,它能够有效地创建一个字典,存储每个价格及其出现的次数。 -
找出出现频率最高的价格的数量:最后,我们需要从统计结果中提取出出现次数最多的价格的出现次数,并返回这个值。如果在第一步中没有找到任何符合条件的价格,返回值应为
0。
处理示例
通过例子来进一步澄清思路:
-
假设
m = 6,而价格列表w = [2, 3, 3, 6, 6, 6, 9, 9, 23]。我们首先会筛选出[2, 3, 3, 6, 6, 6],接着通过Counter统计得到各个价格的出现次数:2出现1次,3出现2次,6出现3次。此时,出现次数最多的价格是6,出现了3次,因此最终结果返回3。 -
对于另一个例子,设
m = 4,w = [1, 2, 4, 4, 4]。经过筛选后,得到的价格是[1, 2, 4, 4, 4]。我们统计得到1出现1次,2出现1次,而4出现了3次。显然,出现次数最多的是4,我们返回3。 -
再来看一个较为极端的情况,当
m = 5,w = [5, 5, 5, 5, 6, 7, 8]。有效的菜肴价格数组为[5, 5, 5, 5],所有的价格为5,而它出现的次数则为4,因此我们返回4。
边界与特殊情况处理
程序的设计还需考虑一些边界情况:
-
所有价格均超过
m:如果输入的价格列表中所有的价格都比m大,则经过筛选整个列表将为空,此时需要返回0。 -
列表为空:如果原始列表
w是空的,即使m给出有效值,程序也应返回0。 -
重复价格:同一个价格出现多次,统计时应确保考虑所有的重复。
复杂度分析
该算法的时间复杂度主要由两个部分构成:
-
过滤价格所需的时间,复杂度为O(n),其中n为列表
w的长度。 -
统计价格频率也需要O(n),使用
Counter来处理。总体来看,算法的时间复杂度可以视为O(n) + O(n),即O(n)。
空间复杂度则取决于统计结果的大小,最坏情况下当所有价格都不相同时,空间复杂度为O(n)。
这个方法通过简单有效的逻辑,将问题分解为小块,从而清晰易懂地达到了目标。整体上,设计简洁并有利于代码的可维护性和性能。