Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7cc171f

Browse files
feat: update solutions to lc/lcof2 problem
* lc No.0347.Top K Frequent Elements * lcof2 No.060
1 parent 0feb6d9 commit 7cc171f

File tree

7 files changed

+149
-109
lines changed

7 files changed

+149
-109
lines changed

‎lcof2/剑指 Offer II 060. 出现频率最高的 k 个数字/README.md‎

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,57 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
经典 Top K 问题,可以用堆解决
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
5052

5153
<!-- 这里可写当前语言的特殊实现逻辑 -->
5254

5355
```python
54-
56+
class Solution:
57+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
58+
counter = Counter(nums)
59+
60+
hp = []
61+
for num, freq in counter.items():
62+
if len(hp) == k:
63+
if freq > hp[0][0]:
64+
heapq.heappop(hp)
65+
heapq.heappush(hp, (freq, num))
66+
else:
67+
heapq.heappush(hp, (freq, num))
68+
69+
return list(map(lambda t: t[1], hp))
5570
```
5671

5772
### **Java**
5873

5974
<!-- 这里可写当前语言的特殊实现逻辑 -->
6075

6176
```java
62-
77+
class Solution {
78+
public int[] topKFrequent(int[] nums, int k) {
79+
Map<Integer, Long> frequency = Arrays.stream(nums).boxed()
80+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
81+
82+
Queue<Map.Entry<Integer, Long>> queue = new PriorityQueue<>(Map.Entry.comparingByValue());
83+
for (Map.Entry<Integer, Long> entry : frequency.entrySet()) {
84+
long count = entry.getValue();
85+
if (queue.size() == k) {
86+
if (count > queue.peek().getValue()) {
87+
queue.poll();
88+
queue.offer(entry);
89+
}
90+
} else {
91+
queue.offer(entry);
92+
}
93+
}
94+
95+
return queue.stream().mapToInt(Map.Entry::getKey).toArray();
96+
}
97+
}
6398
```
6499

65100
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int[] topKFrequent(int[] nums, int k) {
3+
Map<Integer, Long> frequency = Arrays.stream(nums).boxed()
4+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
5+
6+
Queue<Map.Entry<Integer, Long>> queue = new PriorityQueue<>(Map.Entry.comparingByValue());
7+
for (Map.Entry<Integer, Long> entry : frequency.entrySet()) {
8+
long count = entry.getValue();
9+
if (queue.size() == k) {
10+
if (count > queue.peek().getValue()) {
11+
queue.poll();
12+
queue.offer(entry);
13+
}
14+
} else {
15+
queue.offer(entry);
16+
}
17+
}
18+
19+
return queue.stream().mapToInt(Map.Entry::getKey).toArray();
20+
}
21+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
3+
counter = Counter(nums)
4+
5+
hp = []
6+
for num, freq in counter.items():
7+
if len(hp) == k:
8+
if freq > hp[0][0]:
9+
heapq.heappop(hp)
10+
heapq.heappush(hp, (freq, num))
11+
else:
12+
heapq.heappush(hp, (freq, num))
13+
14+
return list(map(lambda t: t[1], hp))

‎solution/0300-0399/0347.Top K Frequent Elements/README.md‎

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45-
"桶排序"实现。
45+
经典 Top K 问题,可以用堆解决
4646

4747
<!-- tabs:start -->
4848

@@ -53,20 +53,18 @@
5353
```python
5454
class Solution:
5555
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 = []
5859
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))
7068
```
7169

7270
### **Java**
@@ -76,31 +74,23 @@ class Solution:
7674
```java
7775
class Solution {
7876
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);
10087
}
88+
} else {
89+
queue.offer(entry);
10190
}
10291
}
103-
return res;
92+
93+
return queue.stream().mapToInt(Map.Entry::getKey).toArray();
10494
}
10595
}
10696
```

‎solution/0300-0399/0347.Top K Frequent Elements/README_EN.md‎

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -36,52 +36,42 @@
3636
```python
3737
class Solution:
3838
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
39-
counter = collections.Counter(nums)
40-
buckets = [[] for _ in range(len(nums) + 1)]
39+
counter = Counter(nums)
40+
41+
hp = []
4142
for num, freq in counter.items():
42-
buckets[freq].append(num)
43-
i, res = len(nums), []
44-
while k > 0 and i >= 0:
45-
if buckets[i]:
46-
for num in buckets[i]:
47-
if k <= 0:
48-
break
49-
res.append(num)
50-
k -= 1
51-
i -= 1
52-
return res
43+
if len(hp) == k:
44+
if freq > hp[0][0]:
45+
heapq.heappop(hp)
46+
heapq.heappush(hp, (freq, num))
47+
else:
48+
heapq.heappush(hp, (freq, num))
49+
50+
return list(map(lambda t: t[1], hp))
5351
```
5452

5553
### **Java**
5654

5755
```java
5856
class Solution {
5957
public int[] topKFrequent(int[] nums, int k) {
60-
Map<Integer, Integer> counter = new HashMap<>();
61-
for (int num : nums) {
62-
counter.put(num, counter.getOrDefault(num, 0) + 1);
63-
}
64-
List<Integer>[] buckets = new List[nums.length + 1];
65-
for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
66-
int num = entry.getKey();
67-
int freq = entry.getValue();
68-
if (buckets[freq] == null) {
69-
buckets[freq] = new ArrayList<>();
70-
}
71-
buckets[freq].add(num);
72-
}
73-
int[] res = new int[k];
74-
for (int i = nums.length; i >= 0 && k > 0; --i) {
75-
if (buckets[i] != null) {
76-
for (int num : buckets[i]) {
77-
if (k <= 0) {
78-
break;
79-
}
80-
res[--k] = num;
58+
Map<Integer, Long> frequency = Arrays.stream(nums).boxed()
59+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
60+
61+
Queue<Map.Entry<Integer, Long>> queue = new PriorityQueue<>(Map.Entry.comparingByValue());
62+
for (Map.Entry<Integer, Long> entry : frequency.entrySet()) {
63+
long count = entry.getValue();
64+
if (queue.size() == k) {
65+
if (count > queue.peek().getValue()) {
66+
queue.poll();
67+
queue.offer(entry);
8168
}
69+
} else {
70+
queue.offer(entry);
8271
}
8372
}
84-
return res;
73+
74+
return queue.stream().mapToInt(Map.Entry::getKey).toArray();
8575
}
8676
}
8777
```
Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,21 @@
11
class Solution {
22
public int[] topKFrequent(int[] nums, int k) {
3-
Map<Integer, Integer> counter = new HashMap<>();
4-
for (int num : nums) {
5-
counter.put(num, counter.getOrDefault(num, 0) + 1);
6-
}
7-
List<Integer>[] buckets = new List[nums.length + 1];
8-
for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
9-
int num = entry.getKey();
10-
int freq = entry.getValue();
11-
if (buckets[freq] == null) {
12-
buckets[freq] = new ArrayList<>();
13-
}
14-
buckets[freq].add(num);
15-
}
16-
int[] res = new int[k];
17-
for (int i = nums.length; i >= 0 && k > 0; --i) {
18-
if (buckets[i] != null) {
19-
for (int num : buckets[i]) {
20-
if (k <= 0) {
21-
break;
22-
}
23-
res[--k] = num;
3+
Map<Integer, Long> frequency = Arrays.stream(nums).boxed()
4+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
5+
6+
Queue<Map.Entry<Integer, Long>> queue = new PriorityQueue<>(Map.Entry.comparingByValue());
7+
for (Map.Entry<Integer, Long> entry : frequency.entrySet()) {
8+
long count = entry.getValue();
9+
if (queue.size() == k) {
10+
if (count > queue.peek().getValue()) {
11+
queue.poll();
12+
queue.offer(entry);
2413
}
14+
} else {
15+
queue.offer(entry);
2516
}
2617
}
27-
return res;
18+
19+
return queue.stream().mapToInt(Map.Entry::getKey).toArray();
2820
}
29-
}
21+
}
Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
class Solution:
22
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
3-
counter = collections.Counter(nums)
4-
buckets = [[] for _ in range(len(nums) + 1)]
3+
counter = Counter(nums)
4+
5+
hp = []
56
for num, freq in counter.items():
6-
buckets[freq].append(num)
7-
i, res = len(nums), []
8-
while k > 0 and i >= 0:
9-
if buckets[i]:
10-
for num in buckets[i]:
11-
if k <= 0:
12-
break
13-
res.append(num)
14-
k -= 1
15-
i -= 1
16-
return res
7+
if len(hp) == k:
8+
if freq > hp[0][0]:
9+
heapq.heappop(hp)
10+
heapq.heappush(hp, (freq, num))
11+
else:
12+
heapq.heappush(hp, (freq, num))
13+
14+
return list(map(lambda t: t[1], hp))

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /