347. Top K Frequent Elements
Medium
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.
题意
在长度为n的数组中找出现次数最多的k个元素
思路
用HashMap的key保存数组元素,value保存出现次数,遍历HashMap的value维护一个长度为k的最小堆,对应k个key值就是答案
代码
class Solution {
class QueueData implements Comparable<QueueData> {
public int num, val;
public QueueData(int num, int val) {
this.num = num;
this.val = val;
}
@Override
public int compareTo(QueueData o) {
return val - o.val;
}
}
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
PriorityQueue<QueueData> q = new PriorityQueue<>();
for (int num: nums) {
if (!map.containsKey(num)) {
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
Iterator<Map.Entry<Integer, Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<Integer, Integer> entry = iter.next();
int num = entry.getKey();
int cnt = entry.getValue();
if (q.size() < k) {
q.add(new QueueData(num, cnt));
} else if (!q.isEmpty() && q.peek().val < cnt) {
q.poll();
q.add(new QueueData(num, cnt));
}
}
List<Integer> ans = new ArrayList<Integer>();
for (QueueData qd: q) {
ans.add(qd.num);
}
return ans;
}
}