面试算法60:出现频率最高的k个数字

题目

请找出数组中出现频率最高的k个数字。例如,当k等于2时,输入数组[1,2,2,1,3,1],由于数字1出现了3次,数字2出现了2次,数字3出现了1次,因此出现频率最高的2个数字是1和2。

分析

如果在面试过程中遇到这个题目,首先要想到的是解决这个题目需要用到哈希表。这个题目的输入是一个数组,哈希表可以用来统计数组中数字出现的频率,哈希表的键是数组中出现的数字,而值是数字出现的频率。

接下来找出出现频率最高的k个数字。可以用一个最小堆存储频率最高的k个数字,堆中的每个元素是数组中的数字及其在数组中出现的次数。由于比较的是数字的频率,因此设置最小堆比较元素的规则,以便让频率最低的数字位于堆的顶部。

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[] nums = {1, 2, 2, 1, 3, 1};
        List<Integer> result = topKFrequent(nums, 2);
        System.out.println(result);
    }

    public static List<Integer> topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> numToCount = new HashMap<>();
        for (int num : nums) {
            numToCount.put(num, numToCount.getOrDefault(num, 0) + 1);
        }

        Queue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
            (e1, e2) -> e1.getValue() - e2.getValue()
        );
        for (Map.Entry<Integer, Integer> entry : numToCount.entrySet()) {
            if (minHeap.size() < k) {
                minHeap.offer(entry);
            }
            else {
                if (entry.getValue() > minHeap.peek().getValue()) {
                    minHeap.poll();
                    minHeap.offer(entry);
                }
            }
        }

        List<Integer> result = new LinkedList<>();
        for (Map.Entry<Integer, Integer> entry : minHeap) {
            result.add(entry.getKey());
        }

        return result;
    }
}
相关推荐
梭七y19 分钟前
【力扣hot100题】(103)移动零
数据结构·算法·leetcode
weixin_4130632138 分钟前
测试《A Simple Algorithm for Fitting a Gaussian Function》拟合
python·算法
MarkHD1 小时前
智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务
算法
IT猿手1 小时前
三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码
算法·matlab·动态规划·无人机·路径规划·动态路径规划
wadesir1 小时前
Java实现遗传算法(从零开始掌握智能优化算法)
java·开发语言·算法
Jeremy爱编码1 小时前
leetcode热题腐烂的橘子
算法·leetcode·职场和发展
H CHY1 小时前
C++代码
c语言·开发语言·数据结构·c++·算法·青少年编程
alphaTao1 小时前
LeetCode 每日一题 2025/12/22-2025/12/28
算法·leetcode
xiaolang_8616_wjl1 小时前
c++题目_传桶(改编于atcoder(题目:Heavy Buckets))
数据结构·c++·算法
中國龍在廣州2 小时前
生成不遗忘,「超长时序」世界模型,北大EgoLCD长短时记忆加持
人工智能·深度学习·算法·自然语言处理·chatgpt