小C在餐馆面临了一项挑战:他想要点一些价格相同的菜品,且这些菜品的价格不超过一定的上限 m。这项问题看似简单,但涉及到一些有趣的解题思路和细节需要注意。本文将详细分析这个问题的解法及背后的一些思考。
问题解析:
小C需要根据给定的价格列表,挑选出价格不超过 m 的菜品,并从中找出数量最多的相同价格的菜品。举例来说,如果餐馆提供的菜品价格列表是 [2, 3, 3, 6, 6, 6, 9, 9, 23],且 m=6,那么在过滤掉价格大于 m 的菜品后,小C会面临 [2, 3, 3, 6, 6, 6] 这些选项。此时,最多的相同价格是 6,小C可以点三道这样的菜。
解题思路:
- 数据预处理:首先,我们需要过滤掉超过
m的菜品价格,以便小C不考虑这些菜。 - 统计价格频率:在剩下的菜品中,我们要找出每个价格出现的次数。这可以通过使用字典(哈希表)来实现,每次遍历价格列表时,更新对应价格的计数。
- 寻找最大频率:在统计好价格出现次数后,我们遍历这个字典来找到出现次数最多的价格,这就是小C最多可以点的菜品数量。
- 边界处理:如果过滤后没有菜品符合条件,返回
0是合理的结果。
代码实现与分析: 代码的核心在于将输入列表进行过滤和计数。使用字典来统计价格频率的时间复杂度是 O(n),其中 n 是菜品列表的长度。过滤操作也是 O(n),因此总体时间复杂度为 O(n),这在大多数应用场景中是高效的。
解题思考与优化:
- 优化思考:在统计价格频率时,我们使用字典是很高效的,但在有序数据中,我们也可以使用二分法来加速查找和计数。不过在这种问题中,由于数据规模不大,使用字典已经足够快速。
- 极端情况:如果菜品价格列表为空,或者所有菜品价格都超过
m,程序应该能够返回0。我们在实现中通过max(count_map.values(), default=0)处理这种情况,避免报错。 - 扩展思考:如果小C希望不仅找出菜品数量最多的价格,还要输出这些菜品的价格,代码可以在返回结果时增加记录价格的逻辑。
代码解析:
-过滤操作:使用列表推导式 filtered_prices = [price for price in w if price <= m] 来筛选出价格不超过 m 的菜品。
-统计频率:通过遍历 filtered_prices,将价格及其出现次数记录在 price_count 字典中。
-寻找最大值:使用 max(price_count.values()) 来找到出现次数最多的价格。
def solution(m: int, w: list) -> int:
# 筛选出价格不超过 m 的菜品
filtered_prices = [price for price in w if price <= m]
# 如果没有符合条件的菜品,返回 0
if not filtered_prices:
return 0
# 统计每个价格出现的次数
price_count = {}
for price in filtered_prices:
if price in price_count:
price_count[price] += 1
else:
price_count[price] = 1
# 找出最多的出现次数
max_count = max(price_count.values())
return max_count
`