问题分析
给定一个整数 m 和一个菜品价格数组 w,我们需要:
- 筛选出数组中所有不超过
m的价格。 - 统计这些价格的出现频率。
- 返回出现次数最多的价格的频率。
整体思路
- 过滤价格:首先,我们需要从
w中筛选出所有小于或等于m的价格。 - 统计频率:使用
HashMap来统计每个价格出现的次数。HashMap的键是价格,值是该价格出现的次数。 - 计算最大频率:遍历
HashMap的值,找到出现次数最多的那个频率。 - 返回结果:返回最大频率。
代码解析
java
public class Main {
public static long solution(int m, int[] w) {
// 创建一个HashMap来统计每个价格出现的频率
HashMap<Integer, Integer> priceCount = new HashMap<>();
- 这里创建了一个
HashMap对象priceCount,用来存储每个价格的出现频率。HashMap的键(key)是菜品的价格,值(value)是该价格的出现次数。
java
// 遍历菜品价格数组
for (int price : w) {
// 如果价格不超过m,则统计其频率
if (price <= m) {
// 更新HashMap中的频率
priceCount.put(price, priceCount.getOrDefault(price, 0) + 1);
}
}
- 遍历数组
w:通过增强型for循环遍历w数组中的每个元素(即菜品的价格)。 - 筛选价格:如果当前价格
price小于或等于m,则将该价格计入priceCount中。 priceCount.getOrDefault(price, 0):如果price已经在priceCount中存在,返回其当前的出现次数;如果不存在,返回默认值0。然后将这个值加1,表示该价格出现了一次。
java
// 初始化最大频率为0
int maxCount = 0;
- 这里初始化一个变量
maxCount用来存储最大出现频率。初始值为0。
java
// 遍历HashMap,找出最大频率
for (int count : priceCount.values()) {
if (count > maxCount) {
maxCount = count;
}
}
- 遍历
priceCount中的值:priceCount.values()返回一个包含所有频率值的集合。 - 更新最大频率:如果当前频率
count大于maxCount,则更新maxCount为count。
java
// 返回最大频率
return maxCount;
}
- 最后,返回
maxCount,即出现次数最多的价格的频率。
main 方法
java
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);
}
-
测试用例:
solution(6, new int[]{2, 3, 3, 6, 6, 6, 9, 9, 23}):在价格小于或等于6的价格中,6出现 3 次,因此返回3。solution(4, new int[]{1, 2, 4, 4, 4}):在价格小于或等于4的价格中,4出现 3 次,因此返回3。solution(5, new int[]{5, 5, 5, 5, 6, 7, 8}):在价格小于或等于5的价格中,5出现 4 次,因此返回4。
图解
-
输入:假设我们有
m = 6和w = {2, 3, 3, 6, 6, 6, 9, 9, 23}。 -
步骤 1:筛选出不超过
6的价格:{2, 3, 3, 6, 6, 6}。 -
步骤 2:统计这些价格的频率:
2出现 1 次3出现 2 次6出现 3 次
-
步骤 3:找出出现次数最多的价格,即
6,其频率为 3。 -
输出:返回最大频率
3。
复杂度分析
- 时间复杂度:
O(n),其中n是数组w的长度。我们需要遍历一次数组来统计价格的频率,再遍历一次HashMap来找出最大频率。由于遍历是线性的,因此总时间复杂度是O(n)。 - 空间复杂度:
O(k),其中k是不超过m的不同价格的数量。在最坏的情况下,k可以等于n,即每个价格都不同,因此空间复杂度为O(n)。
总结
- 这段代码通过
HashMap高效地统计每个价格的出现频率,并找出出现次数最多的价格。 - 使用
HashMap的好处在于能够快速查找和更新频率,确保了代码的高效性。 - 代码逻辑清晰,适用于计算数组中频率最高的元素,特别是在筛选条件下(即价格不超过
m)。