力扣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;
    }
}
相关推荐
强哥聊算力2 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
西柚小萌新5 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
小 黄 鸡5 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
Navigator_Z6 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy6 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
mmmmath_36 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
YangYang9YangYan7 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl27 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风8 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技8 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法