问题描述
小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
解题思路
我们可以使用一个 HashMap 来统计每种价格的菜的数量。这样我们可以快速地知道每种价格的菜有多少道。
算法步骤
-
遍历每道菜的价格:
- 如果价格不超过
m,则将该价格对应的计数加1。
- 如果价格不超过
-
统计数量最多的那一组:
- 遍历
HashMap中的所有计数,找出最大的计数。
- 遍历
关键点
- 过滤价格:只统计价格不超过
m的菜。 - 统计最大数量:在所有统计的价格中,找出数量最多的那一组。
代码
import java.util.HashMap;
public class Main {
public static long solution(int m, int[] w) {
// 创建一个HashMap来统计每种价格的菜的数量
HashMap<Integer, Integer> priceCountMap = new HashMap<>();
// 遍历每道菜的价格
for (int price : w) {
// 如果价格不超过m,则统计数量
if (price <= m) {
// 更新HashMap中的计数
priceCountMap.put(price, priceCountMap.getOrDefault(price, 0) + 1);
}
}
// 初始化最大数量为0
int maxCount = 0;
// 遍历HashMap,找到数量最多的那一组
for (int count : priceCountMap.values()) {
// 更新最大数量
if (count > maxCount) {
maxCount = count;
}
}
// 返回最大数量
return maxCount;
}
public static void main(String[] args) {
System.out.println(solution(6, new int[] { 2, 3, 3, 6, 6, 6, 9, 9, 23 }) == 3);
System.out.println(solution(4, new int[] { 1, 2, 4, 4, 4 }) == 3);
System.out.println(solution(5, new int[] { 5, 5, 5, 5, 6, 7, 8 }) == 4);
}
}
优化思路
-
减少不必要的遍历:
- 当前代码在遍历
HashMap时,会遍历所有的键值对,即使某些键值对的数量已经小于当前的最大数量。我们可以通过在遍历过程中及时更新最大数量来减少不必要的比较。
- 当前代码在遍历
-
减少内存使用:
- 如果菜的价格范围不大,可以考虑使用数组来代替
HashMap,这样可以减少内存开销。
- 如果菜的价格范围不大,可以考虑使用数组来代替
-
优化数据结构:
- 如果菜的价格范围较大,但数量较少,可以考虑使用
TreeMap来代替HashMap,这样可以自动排序,减少后续的排序操作。
- 如果菜的价格范围较大,但数量较少,可以考虑使用
优化方向
-
减少遍历次数:
- 在遍历
HashMap时,如果当前计数已经小于最大数量,可以直接跳过后续的比较。
- 在遍历
-
使用数组代替
HashMap:- 如果菜的价格范围在
[0, m]之间,可以使用一个长度为m+1的数组来统计每种价格的菜的数量。
- 如果菜的价格范围在
-
使用
TreeMap代替HashMap:- 如果菜的价格范围较大,但数量较少,可以使用
TreeMap来自动排序,减少后续的排序操作。
- 如果菜的价格范围较大,但数量较少,可以使用