Leetcode刷题100天—347. 前 K 个高频元素(优先队列)—day16
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—347. 前 K 个高频元素(优先队列)—day16相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
大家好,我叫运智
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
- 1 <= nums.length <= 105
- k 的取值范围是 [1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package 优先队列;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
public class _347_前K个高频元素 {
public int[] topKFrequent(int[] nums, int k) {
// 涉及到词语频率可以用哈希表,前k高的元素可以用优先队列(大顶堆)
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
// 通过for循环计算键出现的次数
for(int num:nums) {
map.put(num, map.getOrDefault(num, 0)+1);
}
// 设置优先队列
PriorityQueue<Data> queue=new PriorityQueue<>(new Comparator<Data>() {
public int compare(Data o1,Data o2) {
return o2.getCount()-o1.getCount();//大顶堆
}
});
// for循环遍历哈希数据到队列中
for(Map.Entry<Integer, Integer> entry:map.entrySet()) {
queue.offer(new Data(entry.getKey(),entry.getValue()));
}
// 取出前k个数输出
int res[]=new int[k];
// for循环遍历列表前k个值
for (int i=0;i<k;i++) {
// 获取弹出的值
Data data= (Data)queue.poll();
// System.out.print(data.getC());
res[i]=data.getC();
}
return res;
}
// 创建一个数据类Data,包含一个int类型的数字和int类型的次数;
public static class Data {
int key;
int value;
public Data(int key,int value) {
this.key=key;
this.value=value;
}
//获取键
public int getC() {
return this.key;
}
// 获取值
public int getCount() {
return this.value;
}
}
}
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
以上是关于Leetcode刷题100天—347. 前 K 个高频元素(优先队列)—day16的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—215. 数组中的第K个最大元素(优先队列)—day15