力扣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;
    }
}
相关推荐
灵感__idea10 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect20 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试