42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
45
- “桶排序”实现。
45
+ 经典 Top K 问题,可以用堆解决
46
46
47
47
<!-- tabs:start -->
48
48
53
53
``` python
54
54
class Solution :
55
55
def topKFrequent (self , nums : List[int ], k : int ) -> List[int ]:
56
- counter = collections.Counter(nums)
57
- buckets = [[] for _ in range (len (nums) + 1 )]
56
+ counter = Counter(nums)
57
+
58
+ hp = []
58
59
for num, freq in counter.items():
59
- buckets[freq].append(num)
60
- i, res = len (nums), []
61
- while k > 0 and i >= 0 :
62
- if buckets[i]:
63
- for num in buckets[i]:
64
- if k <= 0 :
65
- break
66
- res.append(num)
67
- k -= 1
68
- i -= 1
69
- return res
60
+ if len (hp) == k:
61
+ if freq > hp[0 ][0 ]:
62
+ heapq.heappop(hp)
63
+ heapq.heappush(hp, (freq, num))
64
+ else :
65
+ heapq.heappush(hp, (freq, num))
66
+
67
+ return list (map (lambda t : t[1 ], hp))
70
68
```
71
69
72
70
### ** Java**
@@ -76,31 +74,23 @@ class Solution:
76
74
``` java
77
75
class Solution {
78
76
public int [] topKFrequent (int [] nums , int k ) {
79
- Map<Integer , Integer > counter = new HashMap<> ();
80
- for (int num : nums) {
81
- counter. put(num, counter. getOrDefault(num, 0 ) + 1 );
82
- }
83
- List<Integer > [] buckets = new List [nums. length + 1 ];
84
- for (Map . Entry<Integer , Integer > entry : counter. entrySet()) {
85
- int num = entry. getKey();
86
- int freq = entry. getValue();
87
- if (buckets[freq] == null ) {
88
- buckets[freq] = new ArrayList<> ();
89
- }
90
- buckets[freq]. add(num);
91
- }
92
- int [] res = new int [k];
93
- for (int i = nums. length; i >= 0 && k > 0 ; -- i) {
94
- if (buckets[i] != null ) {
95
- for (int num : buckets[i]) {
96
- if (k <= 0 ) {
97
- break ;
98
- }
99
- res[-- k] = num;
77
+ Map<Integer , Long > frequency = Arrays . stream(nums). boxed()
78
+ .collect(Collectors . groupingBy(Function . identity(), Collectors . counting()));
79
+
80
+ Queue<Map .Entry<Integer , Long > > queue = new PriorityQueue<> (Map . Entry . comparingByValue());
81
+ for (Map . Entry<Integer , Long > entry : frequency. entrySet()) {
82
+ long count = entry. getValue();
83
+ if (queue. size() == k) {
84
+ if (count > queue. peek(). getValue()) {
85
+ queue. poll();
86
+ queue. offer(entry);
100
87
}
88
+ } else {
89
+ queue. offer(entry);
101
90
}
102
91
}
103
- return res;
92
+
93
+ return queue. stream(). mapToInt(Map . Entry :: getKey). toArray();
104
94
}
105
95
}
106
96
```
0 commit comments