问题描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 nn 道菜,第 ii 道菜的售价为 wiwi。
小C准备点一些价格相同的菜,但小C不会点单价超过 mm 的菜。
小C想知道,自己最多可以点多少道菜?
测试样例
样例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
这个问题的目标是找到小C在餐馆中最多可以点多少道单价不超过 m
且价格相同的菜。
思路
-
限定价格 :小C只能点单价不超过
m
的菜,所以我们可以先过滤掉所有价格大于m
的菜。 -
统计同样价格的菜的数量:我们需要统计剩下的菜中每种价格出现的次数,然后找出最多的那一类。
-
数据处理:
- 首先遍历菜品价格数组,过滤掉价格大于
m
的菜。 - 然后统计每种价格出现的次数。
- 返回出现次数最多的价格对应的数量。
- 首先遍历菜品价格数组,过滤掉价格大于
解题步骤
-
过滤价格 :通过
std::vector
遍历价格数组,将价格大于m
的菜去除。 -
统计频次 :可以使用
std::unordered_map
来记录每种菜品的价格出现的次数。 -
返回最大值:遍历频次统计,找出出现次数最多的价格的数量。
代码实现
代码解释
-
unordered_map<int, int> price_count;
:- 这个哈希表用于存储每个价格
price
对应的菜的数量。键是价格,值是该价格的菜品数量。
- 这个哈希表用于存储每个价格
-
遍历菜品价格
w
:- 对于每个菜的价格,如果该价格小于等于
m
,就将其添加到price_count
中,并增加该价格的计数。
- 对于每个菜的价格,如果该价格小于等于
-
查找最多的菜品数量:
- 在
price_count
中查找最大的值,即找出出现次数最多的价格对应的菜品数量。
- 在
-
返回结果:
- 如果
price_count
为空,表示没有菜符合条件,返回 0。 - 否则,返回出现次数最多的菜品数量。
- 如果
时间复杂度分析
- 遍历菜品价格
w
,时间复杂度为 O(n),其中n
是菜品数量。 - 在
unordered_map
中查找和更新操作的时间复杂度为 O(1),所以总的时间复杂度是 O(n)。
这个解法通过使用 unordered_map
统计每种菜的数量,并返回最多的那个数量,能够有效地解决问题,时间复杂度为 O(n),适用于大多数输入规模。