347. 前 K 个高频元素【中等】

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

**输入:**nums = [1,1,1,2,2,3], k = 2

输出:[1,2]

示例 2:

**输入:**nums = [1], k = 1

输出:[1]

示例 3:

**输入:**nums = [1,2,1,2,1,2,3,1,3,2], k = 2

输出:[1,2]

一、最小堆

思路:

这是一个Top K 问题 ,优先想到的就是使用最小堆/最大堆 ,使用优先级队列 PriorityQueue实现,PriorityQueue 虽然继承队列接口,但实际底层封装的是树结构,所以它满足堆的所有特性,它就是堆的具体实现。

我们首先创建一个哈希map,key存数组元素,value 存出现的频率,使用map辅助,一是能记录频率,二是能去重。再创建一个最小堆,用map 中的value 来排序。在遍历map 的键数组的过程中,让堆的大小为k,超出k 时移除堆顶元素,最后得到的堆就是包含前k 个高频元素的堆了。

时间复杂度O(n log k),因为堆是树结构,所以插入删除都是log k,当数组元素都不同时遍历耗时n

代码:

java 复制代码
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        // 使用map辅助,一是能记录频率,二是能去重
        Map<Integer, Integer> frequentMap = new HashMap<>();

        for(int num : nums){
            frequentMap.put(num, frequentMap.getOrDefault(num, 0) + 1);
        }

        PriorityQueue<Integer> minHeap = new PriorityQueue<>(
            (a, b) -> frequentMap.get(a) - frequentMap.get(b)
        );

        // map的keySet帮助去重了
        for(int num : frequentMap.keySet()){
            minHeap.offer(num);

            if(minHeap.size() > k){
                minHeap.poll(); 
            }
        }

        int[] reslut = new int[k];
        for(int i = 0; i < k; i++){
            reslut[i] = minHeap.poll();
        }
        
        return reslut;
    }
}
相关推荐
数据皮皮侠6 分钟前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora9 分钟前
Python 算法基础篇之链表
python·算法·链表
科研前沿17 分钟前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算
代码中介商1 小时前
数据结构开篇:从问题到解决方案
数据结构
Wadli1 小时前
26.单调栈
算法
晨曦夜月1 小时前
进程的五大状态及特殊进程解析
linux·服务器·算法
吟安安安安1 小时前
适合短期冲刺的学习工作流(针对算法)
学习·算法
科研前沿1 小时前
什么是时空融合技术?
大数据·人工智能·数码相机·算法·重构·空间计算
AI科技星1 小时前
全域数学本源公理:0、1、∞ 三者核心关系 (典籍定稿版)
人工智能·算法·数学建模·数据挖掘·量子计算
AI科技星1 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘