LeetCode--347.前K个高频元素

  • 给定一个非空的整数数组,返回其中出现频率前 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 是数组的大小。

分析:

使用最大堆的思想对元素进行操作。定义一个TreeMap,将数组中各个元素及其出现的频率传入TreeMap中。定义一个优先队列,重写compareTo方法,使得元素频率出现最小的对象位于优先队列中优先级最高的位置。接着对K元素之后的其他元素进行操做,看元素出现频率的次数是否大于该优先队列中优先级最高的元素。若大于则交换,否则继续执行。

代码实现:
代码一:

class Solution {
	private class Freq implements Comparable{
		int num,freq;//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 topKFrequent(int[] nums, int k) {
		TreeMap map=new TreeMap<>();
		for(int num:nums){
			if(!map.containsKey(num)){
				map.put(num, 1);
			}else{
				map.put(num, map.get(num)+1);
			}
		}
		//Freq=>K-V
        //最小堆
		PriorityQueue queue=new PriorityQueue();
		for(int num:map.keySet()){//O(n)
			if(queue.size()queue.peek().freq){
				queue.remove();							//O(logm)
				queue.add(new Freq(num,map.get(num)));//O(logm)
			}
		}
		LinkedList list=new LinkedList<>();
		while(!queue.isEmpty()){
			list.add(queue.remove().num);
		}
		return list;
	}
}

代码二:

class Solution {
    public List topKFrequent(int[] nums, int k) {
        TreeMap map=new TreeMap<>();
        for(int num:nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num,1);
            }
        }
        PriorityQueue pq=new PriorityQueue<>(new Comparator(){
            public int compare(Integer a,Integer b){
                return map.get(a)-map.get(b);
            }
        });
        for(int key:map.keySet()){
            if(pq.size()map.get(pq.peek())){
                pq.remove();
                pq.add(key);
            }
        }
        LinkedList res=new LinkedList<>();
        while(!pq.isEmpty()){
            res.add(pq.remove());
        }
        return res;
    }
}

你可能感兴趣的:(LeetCode--347.前K个高频元素)