Skip to content

Commit 7cc171f

Browse files
committed
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

+37-2
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
### **...**
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+
}
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

+26-36
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

+25-35
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
```
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+
}
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)