Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >leetcode哈希表之前K个高频元素

leetcode哈希表之前K个高频元素

原创
作者头像
code4it
修改于 2020-10-13 02:01:36
修改于 2020-10-13 02:01:36
47000
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要记录一下leetcode哈希表之前K个高频元素

题目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。



示例 1:

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

示例 2:

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



提示:

    你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
    你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
    题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
    你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        if (nums == null || nums.length <= k) {
            return nums;
        }

        Map<Integer,Integer> countMap = new HashMap<>();
        for (int num : nums) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        PriorityQueue<Integer> queue=new PriorityQueue<>(new Comparator<Integer> () {
            @Override
            public int compare(Integer o1, Integer o2) {
                return countMap.get(o1)-countMap.get(o2);
            }
        });

        for (Map.Entry<Integer,Integer> entry : countMap.entrySet()) {
            if (queue.size() < k) {
                queue.add(entry.getKey());
                continue;
            }

            if (countMap.get(queue.peek()) < entry.getValue()) {
                queue.poll();
                queue.add(entry.getKey());
            }
        }

        int[] result = new int[k];
        for (int i = 0; i < k; ++i) {
            result[i] = queue.poll();
        }
        return result;
    }
}

小结

这里先借助HashMap来统计元素出现的频次,然后再借助PriorityQueue来维护topK的元素,最后取出来topK元素转换为数组。

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
力扣347——前 K 个高频元素
原题url:https://leetcode-cn.com/problems/top-k-frequent-elements/
健程之道
2020/02/19
3960
LeetCode-347-前K个高频元素
第二步建立堆,堆中添加一个元素的复杂度是 O(log(k)),要进行 N 次复杂度是 O(N)。
benym
2022/07/14
2120
LeetCode72|前K个高频元素
hashMap键值对集合加上堆排序的使用,也算是堆,即优先级队列的使用吧,一般自己的写法都是很常规的写法,所以看懂java语法就知道怎么个意思了。
码农王同学
2020/10/14
3970
LeetCode32|前k个高频元素
6,键值对集合的使用,这里自己也曾经分析过java集合的源码,具体见下面的链接吧,但是自己从未去写过hashMap的源码,因为网络上这样的文章的太多了,自己倒是分析过HashSet的源码java进阶|HashSet的源码分析,HashSet是基于HashMap的基础上实现的,自己也分过HashMap的源码文章,但是从没有去写一篇文章
码农王同学
2020/08/25
3080
LeetCode32|前k个高频元素
【力扣-优先队列】前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
六月丶
2022/12/26
3170
栈与队列——347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
向着百万年薪努力的小赵
2022/12/02
2580
求前 K 个高频元素和队列有啥关系
https://leetcode-cn.com/problems/top-k-frequent-elements/
代码随想录
2021/07/16
6820
LeetCode 347 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
王小明_HIT
2021/04/30
3470
算法思想总结:哈希表
1、哈希表底层:通过对C++的学习,我们知道STL中哈希表底层是用的链地址法封装的开散列。
小陈在拼命
2024/06/02
1720
算法思想总结:哈希表
【day05】LeetCode(力扣)每日一刷[1464. 数组中两元素的最大乘积][347. 前 K 个高频元素][2163. 删除元素后和的最小差值 ]
解题思路: 这道题十分简单,当作热身吧。 要选择下标 i 与 j 让 (nums[ i ] - 1)*(nums[ j ] - 1) 取得最大值。 我们不需要纠结选择哪两个下标才能取到最大值,直接为数组排序,选择最大的两个元素分别减1再相乘即可。 我使用的是最大堆为数组元素排序。
.29.
2022/11/15
3580
【day05】LeetCode(力扣)每日一刷[1464. 数组中两元素的最大乘积][347. 前 K 个高频元素][2163. 删除元素后和的最小差值 ]
347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
名字是乱打的
2021/12/24
2690
力扣LeetCode,前 K 个高频元素
1、优先队列的经典问题,在1000000个元素中选出前100名元素,题型模式如在N个元素中选出前M个元素。
别先生
2020/03/20
6720
LeetCode117|最小的k个数
例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
码农王同学
2020/10/27
2850
前 K 个高频元素告诉你桶排序有啥用
今天分享的题目来源于 LeetCode 上第 347 号问题:前 K 个高频元素。题目难度为 Medium,目前通过率为 56.9% 。
五分钟学算法
2019/06/28
1K0
前 K 个高频元素告诉你桶排序有啥用
最小的 K 个数
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围:0≤k,n≤10000,数组中每个数的大小0 ≤val≤1000 要求:空间复杂度 O(n) ,时间复杂度 O(nlogn)
MickyInvQ
2021/12/07
4200
Leetcode 347.Top K Frequent Elements
Top K Frequent Elements   一句话理解题意:输出数组中出现次数对多的k个数。   在如果用C语言来写这个题目,思路就是先按数的大小排序,然后再用一个结构体数组保存每个数的出现次次数。 因为数组已经有序了,所以只需要遍历一次数组就可以获得每个数的出现次数了。 结构体如下
xindoo
2021/01/21
5180
LeetCode 347. 前 K 个高频元素(哈希/优先队列)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/top-k-frequent-elements 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
2450
LeetCode 347. 前 K 个高频元素(哈希/优先队列)
LeetCode动画 | 1054.距离相等的条形码
今天分享一个LeetCode题,题号是1054,标题是距离相等的条形码,题目标签是堆和排序。
我脱下短袖
2020/02/25
5870
leetcode之最常见的单词
这里使用Map来统计单词,并使用Set来查询是否为禁用词,若为禁用词则不加入Map中统计,最后遍历Map取出计数最大的单词。
code4it
2020/11/09
4980
TopN问题
建一个K个数的最小堆,与堆顶比较,大于(等于)堆顶,依次插入堆,超过K个数,踢出堆顶
搬砖俱乐部
2020/01/17
4570
相关推荐
力扣347——前 K 个高频元素
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验