力扣hot100:前K个高频元素

题目描述:

核心思想:

先利用哈希表统计各个元素的频率,再利用小顶堆堆顶元素即是最小元素的特性,维护一个前k个高频元素的数据集。

代码思路:

  1. 统计频率

    首先,使用一个哈希表(HashMap)来统计数组中每个数字出现的次数。遍历数组,对于每个数字,如果它已经在哈希表中,就将其对应的计数加1;如果不在,就将其加入哈希表并初始化计数为1。这样可以快速统计出每个数字的出现频率。

  2. 维护最小堆

    使用一个最小堆(优先队列)来维护当前出现频率最高的k个数字。最小堆的大小始终保持为k,并且堆顶元素是频率最小的数字。

    遍历哈希表中的所有数字:

    • 如果当前最小堆的大小小于k,直接将该数字加入堆中。

    • 如果最小堆的大小已经等于k,并且当前数字的频率大于堆顶元素的频率,则移除堆顶元素,并将当前数字加入堆中。这样可以保证堆中始终存储的是当前频率最高的k个数字。

  3. 提取结果

    将最小堆中的所有数字依次取出,存入一个列表中。由于最小堆是按照频率从小到大排序的,最终需要将列表中的数字反转,以得到频率从高到低的结果。最后,将列表转换为数组,返回结果。

代码:

java 复制代码
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> map.get(a) - map.get(b));
        for (Integer key : map.keySet()) {
            if (pq.size() < k) {
                pq.add(key);
            } else if (map.get(pq.peek()) < map.get(key)) {
                pq.remove();
                pq.add(key);
            }
        }
        List<Integer> list = new ArrayList<>();
        while (!pq.isEmpty()) {
            list.add(pq.remove());
        }
        int[] res=list.stream().mapToInt(Integer::intValue).toArray();
        return res;
    }
}
相关推荐
happyprince21 小时前
01-整体观-Codex全貌解读(源码)
算法·ai编程
俊基科技1 天前
别自己写算法了,让这颗37.5毫米的模组替你“闭嘴干活”
神经网络·算法·硬件开发·ai降噪·语音模块·回音消除
_Narcissus_1 天前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
世人万千丶1 天前
鸿蒙项目实战 - 社区活动编排板:标签云布局算法与自动换行
学习·算法·华为·harmonyos·鸿蒙
zander2581 天前
LeetCode 279. 完全平方数
算法·深度优先
典典分享指南1 天前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
_Narcissus_1 天前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
天疆说1 天前
策略的进化:从随心所欲到稳健前行
算法
冻柠檬飞冰走茶1 天前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list