Description:
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
题意:给定一个一维数组nums和一个整数k,返回k个出现次数最多的元素;并且要求实践复杂度为O(nlogn);
解法:首先,我们需要统计不同元素出现的次数,可以使用哈希表存储;对于要返回出现次数最大的k个元素,考虑利用最大堆来实现,循环k次,每次取出堆顶的元素并删除堆顶元素;
Java
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, Integer> frequence = new HashMap<>();
List<Integer> res = new ArrayList<>();
for (int num: nums) {
frequence.put(num, frequence.getOrDefault(num, 0) + 1);
}
Queue<Integer> head = new PriorityQueue<>(
(num1, num2) -> frequence.get(num2) - frequence.get(num1));
for (int num: frequence.keySet()) {
head.add(num);
}
while (k-- > 0) {
res.add(head.poll());
}
return res;
}
}