题目地址:
https://www.lintcode.com/problem/top-k-frequent-elements/description
给定一个数组,求其数字中出现频率前 高的元素。题目保证 小于等于数组中unique数字的个数。
可以用最小堆来做。先用一个哈希表记录每个数字出现的频率,然后用最小堆动态存储频率前 大的元素,直到数组遍历完毕。代码如下:
import java.util.*;
public class Solution {
/**
* @param nums: the given array
* @param k: the given k
* @return: the k most frequent elements
*/
public List<Integer> topKFrequent(int[] nums, int k) {
// Write your code here
// 先存储每个数字出现的频率
Map<Integer, Integer> freq = new HashMap<>();
for (int num : nums) {
freq.put(num, freq.getOrDefault(num, 0) + 1);
}
// 开一个最小堆,频率低者优先级高
PriorityQueue<Integer> minHeap = new PriorityQueue<>((i1, i2) -> freq.get(i1) <= freq.get(i2) ? -1 : 1);
for (int num : freq.keySet()) {
if (minHeap.size() < k) {
minHeap.offer(num);
} else {
if (freq.get(num) > freq.get(minHeap.peek())) {
minHeap.poll();
minHeap.offer(num);
}
}
}
List<Integer> res = new ArrayList<>();
res.addAll(minHeap);
return res;
}
}
时间复杂度 ,空间 。