小C点菜问题 为了解决这个问题,我们需要找到最大数量的价格相同且不超过给定上限 m 的菜品。具体来说,解决思路可以分为以下几个步骤:
解决思路
1.筛选价格不超过 m 的菜品:首先,我们需要筛选出价格不超过 m 的菜品,因为小C不能点单价超过 m 的菜。
2.统计每个价格的菜品数量:对于每个菜品价格,统计其出现的次数。
3.找到出现最多次数的价格:我们从价格不超过 m 的菜品中,找到出现次数最多的价格,返回这个价格对应的菜品数量。
代码实现
from collections import Counter
def solution(m: int, w: list) -> int:
# 1. 筛选出价格不超过 m 的菜
valid_prices = [price for price in w if price <= m]
# 2. 如果没有符合条件的菜,直接返回 0
if not valid_prices:
return 0
# 3. 统计各个价格出现的次数
price_count = Counter(valid_prices)
# 4. 找到出现次数最多的价格
return max(price_count.values())
if name == 'main':
print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3) # 输出 3
print(solution(4, [1, 2, 4, 4, 4]) == 3) # 输出 3
print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4) # 输出 4
代码解析
4.筛选价格不超过 m 的菜品:我们使用列表推导式来筛选出所有价格小于或等于 m 的菜品。比如在 w = [2, 3, 3, 6, 6, 6, 9, 9, 23] 中,如果 m = 6,我们筛选出的菜品是 [2, 3, 3, 6, 6, 6]。
5.统计价格的频次:使用 Python 的 collections.Counter 来统计价格出现的次数,它会返回一个字典,其中键是菜品的价格,值是该价格菜品的数量。例如,在 valid_prices = [2, 3, 3, 6, 6, 6] 中,Counter(valid_prices) 会返回 {3: 2, 6: 3, 2: 1}。
6.找到最大频次:我们通过 max(price_count.values()) 来获取出现次数最多的价格的数量。
7.返回结果:返回最常见价格的菜品数量。
复杂度分析
8.时间复杂度:我们首先筛选菜品,时间复杂度是 O(n),其中 n 是菜品的数量。接着使用 Counter 统计频次,时间复杂度也是 O(n)。因此,总时间复杂度为 O(n)。
9.空间复杂度:存储筛选出的有效菜品和频次统计的字典,空间复杂度是 O(n)。
测试用例
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
解释
10.在示例 1 中,m = 6,菜品的价格为 [2, 3, 3, 6, 6, 6, 9, 9, 23]。符合条件的菜品是 [2, 3, 3, 6, 6, 6],其中价格 6 出现最多(出现 3 次),所以答案是 3。
11.在示例 2 中,m = 4,菜品的价格为 [1, 2, 4, 4, 4]。符合条件的菜品是 [1, 2, 4, 4, 4],其中价格 4 出现最多(出现 3 次),所以答案是 3。
12.在示例 3 中,m = 5,菜品的价格为 [5, 5, 5, 5, 6, 7, 8]。符合条件的菜品是 [5, 5, 5, 5],价格 5 出现最多(出现 4 次),所以答案是 4。