解题思路详解
1. 问题分析
本题的目标是计算出在满足一定条件下,小C可以点的最多的同价菜的数量。具体条件包括:
- 小C只能选择单价不超过
m的菜。 - 小C点的菜必须是价格相同的,即从所有可选菜中找到一个价格,这个价格的菜数量最多。
问题可以被归类为一个带约束的最大值查找问题,具体来说:
- 输入包括一个整数
m(价格上限)和一个列表w(所有菜的价格)。 - 输出为在价格不超过
m的范围内,出现次数最多的菜的数量。
2. 分析步骤
为了更高效地解决问题,我们需要先对题目中的核心操作进行拆解和分析。
2.1 数据统计
任务:统计每个菜价格的出现次数。
- 这是一个典型的计数问题,可以使用 Python 的
collections.Counter数据结构,它可以快速统计列表中每个元素出现的频率,并返回一个字典格式的结果。例如:from collections import Counter prices = [2, 3, 3, 6, 6, 6] count = Counter(prices) print(count) # 输出:Counter({6: 3, 3: 2, 2: 1})
2.2 筛选合法价格
任务:过滤出单价不超过 m 的菜。
- 对
Counter结果进行遍历,检查每个价格是否满足条件(价格 <= m)。若不满足,则直接跳过。 - 过滤后,只需关注合法价格的计数值。
2.3 找出最大计数
任务:在合法价格中找到数量最多的菜。
- 遍历过滤后的数据,记录出现次数的最大值。该值就是小C最多能点的菜的数量。
3. 算法步骤总结
我们可以将问题分解为以下几个明确的步骤:
- 使用
Counter统计每个菜价格的出现次数; - 遍历统计结果,筛选出价格不超过
m的价格; - 记录符合条件的菜中最大计数值并返回。
4. 算法复杂度分析
-
时间复杂度:
- 使用
Counter对价格列表进行计数的时间复杂度为 ( O(n) ),其中 ( n ) 是价格列表的长度。 - 遍历
Counter中的价格键值对的复杂度为 ( O(k) ),其中 ( k ) 是价格的种类数(通常远小于 ( n ))。 - 因此总的时间复杂度为 ( O(n + k) )。
- 使用
-
空间复杂度:
- 使用
Counter需要存储价格和对应的计数,其空间复杂度为 ( O(k) ),其中 ( k ) 是价格的种类数。
- 使用
5. 边界条件分析
- 空列表:如果价格列表为空,直接返回
0,因为没有菜可以点。 - 所有菜价格均超过
m:若所有菜价格都不符合条件,则过滤后无有效结果,应返回0。 - 所有菜价格相同:如果价格列表中所有价格都一样,并且价格小于或等于
m,结果就是价格列表的长度。 - 价格列表中存在多个符合条件的最大值:程序逻辑能够正确返回其中一个最大计数值。
6. 代码实现
以下是完整的代码实现:
from collections import Counter
def solution(m: int, w: list) -> int:
# 统计每个价格出现的次数
price_count = Counter(w)
# 筛选出价格不超过 m 的菜
max_count = 0
for price, count in price_count.items():
if price <= m:
max_count = max(max_count, count) # 更新最大计数值
return max_count
# 测试样例
if __name__ == '__main__':
print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3) # 样例1
print(solution(4, [1, 2, 4, 4, 4]) == 3) # 样例2
print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4) # 样例3
print(solution(10, []) == 0) # 边界测试1:空列表
print(solution(2, [3, 4, 5]) == 0) # 边界测试2:所有菜价格超过 m
7. 样例详解
样例1:
输入:m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
处理过程:
- 使用
Counter统计:{6: 3, 3: 2, 9: 2, 2: 1, 23: 1}。 - 筛选价格不超过
6:{6: 3, 3: 2, 2: 1}。 - 最大值为
3。
输出:3。
样例2:
输入:m = 4, w = [1, 2, 4, 4, 4]
处理过程:
- 使用
Counter统计:{4: 3, 1: 1, 2: 1}。 - 筛选价格不超过
4:{4: 3, 1: 1, 2: 1}。 - 最大值为
3。
输出:3。
总结
本题通过统计和筛选的方法,高效解决了带约束的最大值查找问题。通过合理设计数据结构和算法流程,我们确保了代码的时间和空间复杂度尽可能低,同时全面覆盖了各种边界情况,是一个典型的计数和过滤问题的良好案例。