问题描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 nn 道菜,第 ii 道菜的售价为 wiwi。
小C准备点一些价格相同的菜,但小C不会点单价超过 mm 的菜。
小C想知道,自己最多可以点多少道菜?
测试样例
样例1:
输入:
m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
输出:3
解题思路
本题的核心思路是先统计餐馆中价格不超过给定金额 m 的各菜品价格出现的频次,然后从这些频次中找出最大值,这个最大值就是小 C 能点到的价格相同的菜的最大数量。通过使用 HashMap 来方便地记录每个价格及其对应的出现频次,再遍历这个 HashMap 来获取频次的最大值。
因此本题我们分为三大步:
1.统计各价格的频次:
创建一个 Map<Integer, Integer> 类型的 priceCount(这里实际使用的是 HashMap),其中键(Integer 类型)用于存放菜品的价格,值(也是 Integer 类型)用于记录该价格的菜品出现的频次。
遍历给定的整数数组 w(数组中的元素代表各菜品的价格),对于每个元素 price,先判断 if (price <= m),只有当菜品价格小于等于 m 时,才使用 priceCount.put(price, priceCount.getOrDefault(price, 0) + 1) 语句来更新 priceCount 中对应价格的频次。priceCount.getOrDefault(price, 0) 这部分会先尝试获取 price 对应的当前频次,如果 price 不存在于 priceCount 中(即首次出现),则返回默认值 0,然后将这个获取到的值加 1 后再通过 put 方法更新 priceCount 中 price 对应的频次,这样就完成了对价格不超过 m 的各菜品价格频次的统计。
2.找出频次的最大值:
初始化一个变量 maxCount 为 0,用于记录频次的最大值。
通过 for (int count : priceCount.values()) 循环遍历 priceCount 中所有的值(也就是各价格对应的频次)。
对于每个 count 值,判断 if (count > maxCount),如果发现某个频次 count 大于当前记录的最大值 maxCount,就将 maxCount 更新为这个更大的 count 值,经过这样一轮遍历后,maxCount 就存储了所有价格频次中的最大值。
3.返回结果:
最后返回 maxCount,它代表着小 C 最多可以点到的价格相同的菜的数量。
主要代码为:
根据
solution 函数的实现,能够依据给定的餐馆菜品价格数组以及小 C 设定的价格上限 m,准确地计算出小 C 最多可以点到的价格相同的菜的数量。利用 HashMap 高效地统计了各价格菜品的频次,再通过简单的比较逻辑找出最大频次。主函数中的测试用例展示了函数在不同输入情况下的预期表现,初步验证了函数功能的正确性,这种实现方式适用于解决涉及根据元素出现频次及限定条件来获取特定最值的问题。