力扣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;
    }
}
相关推荐
tyler_download3 分钟前
deepseek后训练算法:位置编码算法RoPE详解1
算法
青少儿编程课堂26 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
YSL0701241 小时前
一文通关-----排序
数据结构·算法
ZhengEnCi11 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长14 小时前
C++:红黑树
数据结构·算法
文丑颜不良啊14 小时前
LeetCode1661~1680题目解析
java·leetcode
AI备案指南-满满14 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor14 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David14 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法