题目
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
说明:
1、你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
2、你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
示例
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路
利用hahmap统计频率,然后利用堆统计最大的k个元素,最后把k个元素放入List返回即可。
代码
public class problem347 {
public List<Integer> topKFrequent(int[] nums, int k) {
// 结果集
List<Integer> res = new ArrayList<Integer>();
// hashmap统计频率
Map<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
hashmap.put(nums[i], hashmap.containsKey(nums[i]) ? hashmap.get(nums[i]) + 1 : 1);
}
// 构建堆
PriorityQueue<Integer> heap = new PriorityQueue<Integer>((n1, n2) -> hashmap.get(n1) - hashmap.get(n2));
for (int n : hashmap.keySet()) {
heap.add(n);
if (heap.size() > k)
heap.poll();
}
for(int i=0;i<k;i++){
res.add(heap.poll());
}
return res;
}
public static void main(String[] args) {
problem347 pro = new problem347();
int[] nums = { 5, 2, 5, 3, 5, 3, 1, 1, 3 };
List<Integer> res = pro.topKFrequent(nums, 2);
for (int ele : res) {
System.out.print(ele + " ");
}
}
}