题目:小C点菜问题
1、题目描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 n 道菜,第 i 道菜的售价为 wi。
小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。
小C想知道,自己最多可以点多少道菜?
2、测试用例
样例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
3、解题思路
(1)问题理解
由题可知,餐厅的菜单数量和价格由我们输入,小C选择想要的菜品单价,由我们编写一段代码来筛选菜单价格里面小于或者等于小C选择的菜品价格的菜品数量并且选中菜单还需满足重复这一要求。
所以我们要根据小C想要的菜品的价格,从所有菜单中选出一些价格相同的菜,并且这些菜的价格不能超过给定的上限价格‘m’。我们需要找出在满足这个条件下,小C最多可以点多少道菜。
(2)数据结构选择
根据对这道题目的分析,我首先反应是应该选择数组的形式进行存储菜单中菜品的价格。由于需要找出价格相同的菜,选择使用哈希表(即字典)来统计每个价格出现的次数,这样可以快速地对每个价格进行计数。在统计完每个价格出现的次数后,需要对这些价格进行筛选,只保留小于或等于‘m’的价格。筛选后,遍历哈希表,找出出现次数最多的价格,这个次数就是小C最多可以点的菜的数量。
数据结构——哈希表(字典):
哈希表是一种通过键(key)来存储和检索值(value)的数据结构。在Python中,字典(dict)是一种内置的哈希表实现。哈希表提供了快速的查找、插入和删除操作,其平均时间复杂度为O(1)。在这个问题中,哈希表用于:
a. 统计频次:通过将每个菜的价格作为键,出现次数作为值,我们可以快速统计每个价格的出现频次;
b. 快速筛选:哈希表允许我们快速检查某个价格是否已经出现过,以及它出现的次数。
(3)代码编写步骤
a. 遍历价格数组:统计每种价格的菜的数量,并将结果存储在哈希表中;
b. 筛选价格:遍历哈希表,只考虑价格不超过‘m’的菜;
c. 找出最大数量:在筛选后的价格中,找出数量最多的那个,即为小C最多可以点的菜的数量。
(4)代码详解
def solution(m: int, w: list) -> int:
# 定义一个哈希表,用于统计各个菜品的价格
price_count = {}
# 循环遍历菜单数组,寻找小于m的价格,如果存在,则在相应的表里面加一个,不存在则该表数量为1
for price in w:
if price <= m:
if price in price_count:
price_count[price] += 1
else:
price_count[price] = 1
#定义一个变量,用于储存哈希表中数量最大的数,并返回
max_count = 0
for count in price_count.values():
if count > max_count:
max_count = count
return max_count
4、试题经验总结
通过这个问题,我们不仅学习了如何使用哈希表来统计频次和筛选数据,还学习了如何通过算法来寻找满足特定条件的最大值。这些问题的解决方法在计算机科学和软件开发中非常常见,掌握它们对于解决实际问题非常有帮助。此外,这个问题也提醒我们在设计算法时要考虑时间复杂度和空间复杂度,以实现最优的性能。
该题目:
时间复杂度O(n)(其中n为菜品的数量)
空间复杂度O(n)(其中n为菜品的数量)