leetcode
leetcode 2551 ~ 2600
最大频率元素计数

最大频率元素计数

难度:

标签:

题目描述

You are given an array nums consisting of positive integers.

Return the total frequencies of elements in nums such that those elements all have the maximum frequency.

The frequency of an element is the number of occurrences of that element in the array.

 

Example 1:

Input: nums = [1,2,2,3,1,4]
Output: 4
Explanation: The elements 1 and 2 have a frequency of 2 which is the maximum frequency in the array.
So the number of elements in the array with maximum frequency is 4.

Example 2:

Input: nums = [1,2,3,4,5]
Output: 5
Explanation: All elements of the array have a frequency of 1 which is the maximum.
So the number of elements in the array with maximum frequency is 5.

 

Constraints:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

代码结果

运行时间: 22 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 使用流式操作统计每个元素的频率。
 * 2. 找到最大频率。
 * 3. 计算具有最大频率的元素的总数量。
 */

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Solution {
    public int findMaxFrequencyCount(int[] nums) {
        // 统计每个元素的频率
        Map<Integer, Long> frequencyMap = Arrays.stream(nums)
            .boxed()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        // 找到最大频率
        long maxFrequency = frequencyMap.values().stream()
            .max(Long::compare)
            .orElse(0L);
        // 计算具有最大频率的元素的总数量
        long maxFrequencyCount = frequencyMap.values().stream()
            .filter(frequency -> frequency == maxFrequency)
            .mapToLong(Long::longValue)
            .sum();
        return (int) maxFrequencyCount;
    }
}

解释

方法:

本题解首先使用了Counter来统计数组nums中每个元素的频率,存储在字典ds中。接着,通过遍历ds的值找到最大频率maxN。然后,再次遍历ds,统计所有频率等于maxN的元素的频率总和,这一总和即为所有具有最大频率的元素在数组中出现的次数。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在使用Counter来统计每个元素的频率后,你是如何确保找到的最大频率真正代表了数组中出现最频繁的元素?
Counter对象会为数组中每个元素计算其出现的次数,并以字典形式返回。通过从这个字典中找到最大的值,我们可以确保这个最大值代表的是数组中出现频率最高的元素的频率。因为Counter确实计算了所有元素的频率,所以通过检查所有这些频率值,我们可以准确地找到最大频率。
🦆
在计算最大频率maxN时,为什么选择使用生成器表达式而不是直接对Counter对象调用max函数?
使用生成器表达式可以直接在遍历Counter字典的值时计算最大值,这样做可以节省内存,因为生成器表达式不需要先将所有值存储在一个临时列表中。直接使用max函数同样有效,但使用生成器表达式是一种更优雅且内存效率更高的方式。
🦆
题解中再次遍历字典来统计答案时,是否有更高效的方法来同时获得最大频率及其对应的元素总数,以减少遍历次数?
可以在第一次遍历字典时同时计算最大频率和对应的元素总数。即在构建Counter对象后,遍历每个元素的频率,同时更新最大频率和对应频率的元素的累积总数。这样可以将两次遍历合并为一次,提高算法效率。
🦆
在处理边界情况,比如数组中每个元素都是唯一的,或者所有元素都是相同的情况下,这种算法的性能表现如何?
当数组中每个元素都是唯一的时候,Counter对象中每个元素的频率都是1,算法依然能够正确地返回所有元素的总频率,即数组的长度。当所有元素都相同的时候,Counter只会有一个键值对,其频率等于数组的长度,算法可以立即确定这是最大频率并返回。在这两种边界情况下,算法都能以高效的方式执行,不会出现性能下降。

相关问题