LeetCode347.前K个高频元素(Java实现)

链接:https://leetcode-cn.com/problems/top-k-frequent-elements/

class Solution {
    
	private class Freq implements Comparable<Freq>{
		int num,freq;
		public Freq(int num,int freq){
			this.num=num;
			this.freq=freq;
		}
		@Override
		public int compareTo(Freq another) {
			if(this.freq>another.freq){
				return 1;
			}else if(this.freq<another.freq){
				return -1;
			}else{
				return 0;
			}
		}
	}
	public List<Integer> topKFrequent(int[] nums, int k) {
		TreeMap<Integer,Integer> map=new TreeMap<>();
		for(int num:nums){
			if(!map.containsKey(num)){
				map.put(num, 1);
			}else{
				map.put(num, map.get(num)+1);
			}
		}
        //最小堆
		PriorityQueue<Freq> queue=new PriorityQueue<Freq>();
		for(int num:map.keySet()){//O(n)
			if(queue.size()<k){
				queue.add(new Freq(num, map.get(num)));//O(logm)
			}else if(map.get(num)>queue.peek().freq){
				queue.remove();							//O(logm)
				queue.add(new Freq(num,map.get(num)));//O(logm)
			}
		}
		LinkedList<Integer> list=new LinkedList<>();
		while(!queue.isEmpty()){
			list.add(queue.remove().num);
		}
		return list;
	}

}
发布了88 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u010189239/article/details/89575839