347. 前 K 个高频元素

发布于 2024-06-12  13 次阅读


给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

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

输出: [1,2]

示例 2:

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

输出: [1]

思路:先遍历一遍数组,用Hash Map记录每个数出现的次数,然后建一个小根堆存储数组,数组包含数和出现次数,按出现次数排序。当堆满k时进行判断,若堆顶元素小于当前数的次数,则移除堆顶元素,加入新的元素。最后新建数组添加答案。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
		HashMap<Integer, Integer> map = new HashMap<>();
		for(int num : nums){
			map.put(num, map.getOrDefault(num,0) + 1);
		}
		PriorityQueue<int[]> queue = new PriorityQueue<>((a,b) -> (a[1] - b[1]));
		for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
			Integer key = entry.getKey();
			Integer value = entry.getValue();
			if(queue.size() == k){
				if(queue.peek()[1] < value){
					queue.remove();
					queue.offer(new int[]{key, value});
				}
			}else {
				queue.offer(new int[]{key, value});
			}
		}

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