1.题目描述:
给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。
2.使用hashmap统计频次,再对value值进行排序(treeset只能对key排序),采用逆序取前k个值(需要完全遍历entryset排序),相当于大顶堆,时间复杂度O(nlogn)。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i : nums) {
if (map.containsKey(i)) map.put(i, map.get(i) + 1);
else map.put(i, 1);
}
//PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue());
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> entry1, Map.Entry<Integer, Integer> entry2) {
return entry2.getValue() - entry1.getValue();
}
});
//pq.addAll(map.entrySet());
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
pq.offer(entry);
}
int[] arr = new int[k];
for (int i = 0 ; i < k; i++) {
arr[i] = pq.poll().getKey();
}
return arr;
}
}
3.使用hashmap统计频次,再对value值进行排序(treeset只能对key排序),采用顺序k个最大值(只维护k个entry的排序),相当于小顶堆,时间复杂度O(nlogk)。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i : nums) {
if (map.containsKey(i)) map.put(i, map.get(i) + 1);
else map.put(i, 1);
}
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
pq.offer(entry);
if (pq.size() > k) {
pq.poll();//添加当前entry后每次移除最小元素
}
}
int[] arr = new int[k];
for (int i = 0 ; i < k; i++) {
arr[i] = pq.poll().getKey();
}
return arr;
}
}