|
1 | 1 | class Solution {
|
2 | 2 | public int[] topKFrequent(int[] nums, int k) {
|
3 |
| - if (nums == null || nums.length == 0) { |
4 |
| - return new int[0]; |
5 |
| - } |
6 |
| - |
7 |
| - Map<Integer, Integer> hm = new HashMap<>(); |
| 3 | + Map<Integer, Integer> freqMap = new HashMap<>(); |
| 4 | + List<List<Integer>> buckets = new ArrayList<>(); |
8 | 5 |
|
9 |
| - for (int num : nums) { |
10 |
| - hm.put(num, hm.getOrDefault(num, 0) + 1); |
| 6 | + for (int i = 0; i < nums.length; i++) { |
| 7 | + freqMap.merge(nums[i], 1, Integer::sum); |
11 | 8 | }
|
12 | 9 |
|
13 |
| - int i = 0; |
14 |
| - int[] unique = new int[hm.size()]; |
15 |
| - for (int key : hm.keySet()) { |
16 |
| - unique[i++] = key; |
| 10 | + for (int i = 0; i <= nums.length; i++) { |
| 11 | + buckets.add(new ArrayList<>()); |
17 | 12 | }
|
18 | 13 |
|
19 |
| - int low = 0, high = unique.length - 1; |
| 14 | + for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) { |
| 15 | + int number = entry.getKey(); |
| 16 | + int freq = entry.getValue(); |
20 | 17 |
|
21 |
| - while (low < high) { |
22 |
| - int idx = quickSelect(unique, hm, low, high); |
23 |
| - |
24 |
| - if (idx == k) { |
25 |
| - break; |
26 |
| - } else if (idx < k) { |
27 |
| - low = idx + 1; |
28 |
| - } else { |
29 |
| - high = idx - 1; |
30 |
| - } |
| 18 | + buckets.get(freq).add(number); |
31 | 19 | }
|
32 | 20 |
|
33 |
| - return Arrays.copyOf(unique, k); |
34 |
| - } |
35 |
| - |
36 |
| - private int quickSelect(int[] nums, Map<Integer, Integer> hm, int low, int high) { |
37 |
| - int idx = low, pivot = high; |
38 |
| - int pivot_frequency = hm.get(nums[pivot]); |
| 21 | + int[] result = new int[k]; |
| 22 | + int idx = 0; |
39 | 23 |
|
40 |
| - for (int i = low; i < high; i++) { |
41 |
| - if (hm.get(nums[i]) > pivot_frequency) { |
42 |
| - swap(nums, i, idx); |
| 24 | + for (int i = buckets.size() - 1; i >= 0 && idx < k; i--) { |
| 25 | + for (int n : buckets.get(i)) { |
| 26 | + result[idx] = n; |
43 | 27 | ++idx;
|
| 28 | + if (idx == k) { break; } |
44 | 29 | }
|
45 | 30 | }
|
46 | 31 |
|
47 |
| - swap(nums, idx, high); |
48 |
| - return idx; |
49 |
| - } |
50 |
| - |
51 |
| - private void swap(int[] nums, int i, int j) { |
52 |
| - int temp = nums[i]; |
53 |
| - nums[i] = nums[j]; |
54 |
| - nums[j] = temp; |
55 |
| - return; |
| 32 | + return result; |
56 | 33 | }
|
57 | 34 | }
|
0 commit comments