leetcode TopKFrequentElements
z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.*;

public class TopKFrequentElements {
/**
* Top K Frequent Elements
* 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.
*/
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> frequency = new HashMap<>();
PriorityQueue<int[]> res = new PriorityQueue<int[]>((a, b)-> a[1] - b[1]);
for (int i: nums){
if (!frequency.containsKey(i)){
int count = frequency.get(i);
frequency.replace(i, count + 1);
}
else {
frequency.put(i, 1);
}
}
for (int key: frequency.keySet()){
int f = frequency.get(key);
if (res.size()!= k){
res.offer(new int[]{key, f});
}
else {
int[] t = res.poll();
if (t[1] > f){
res.remove();
res.offer(new int[]{key, f});
}
}
}

List<Integer> r = new LinkedList<>();
for (int f: frequency.keySet()){
r.add(f);
}
return r;
}


public List<Integer> topKFrequentII(int[] nums, int k) {
HashMap<Integer, Integer> frequency = new HashMap<>();
for (int i: nums) {
if (!frequency.containsKey(i)) {
frequency.put(i, 0);
}
frequency.put(i, frequency.get(i)+1);
}

List<Integer>[] bucket = new List[nums.length];

for (int key: frequency.keySet()) {
int f = frequency.get(key);
if (bucket[f] == null) {
bucket[f] = new ArrayList<>();
}
bucket[f].add(key);
}

List<Integer> ans = new ArrayList<>();

for (int i=nums.length-1; i>=0 && k>0; i--) {
if (bucket[i] != null) {
for (int num: bucket[i]){
ans.add(num);
}
k -= bucket[i].size();
}
}
return ans;
}

}