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

LeetCode刷题笔记-数据结构-day20

LeetCode刷题笔记-数据结构-day20

LeetCode刷题笔记-数据结构-day20

Leetcode刷题100天—剑指 Offer 22. 链表中倒数第k个节点(链表)—day26

Leetcode刷题100天—剑指 Offer 22. 链表中倒数第k个节点(链表)—day26