Skip to content

Commit 5e8c2fc

Browse files
committed
feat: add solutions to lc problem: No.1086
No.1086.High Five
1 parent 34bfb36 commit 5e8c2fc

File tree

8 files changed

+281
-95
lines changed

8 files changed

+281
-95
lines changed

solution/1000-1099/1080.Insufficient Nodes in Root to Leaf Paths/README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,17 @@
5353

5454
**方法一:递归**
5555

56-
递归遍历整棵树,如果到达叶子结点且路径和小于 $limit$,直接返回 `null` 表示删除。如果左右子树都被删除,说明经过当前结点的路径和也一定小于 $limit$,同样需要删除。
56+
我们递归遍历整棵树,对于当前遍历到的节点 $root$:
5757

58-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的结点数。
58+
如果 $root$ 为空,那么返回空;否则,我们将 $limit$ 减去当前节点的值,即 $limit = limit - root.val$,然后继续执行下述步骤。
59+
60+
如果 $root$ 为叶子节点(即 $root$ 的左右子节点都为空),说明我们已经走完了一条从根节点到叶子节点的路径。如果此时 $limit \gt 0$,说明该路径上所有节点的值的和小于 $limit$,我们返回空节点,表示删除;否则,说明该路径上所有节点的值的和大于等于 $limit$,我们返回 $root$。
61+
62+
如果 $root$ 不是叶子节点,那么我们递归调用函数 $sufficientSubset$,对 $root$ 的左右子节点分别进行处理,并将返回值分别赋值给 $root$ 的左右子节点。
63+
64+
如果 $root$ 的左右子节点在经过递归调用后变成了空节点,那么说明 $root$ 的左右子树中所有从根节点到叶子节点的路径上所有节点的值的和都小于 $limit$,因此我们返回空节点,表示删除 $root$;否则,说明 $root$ 的左右子树中存在从根节点到叶子节点上所有节点值的和大于等于 $limit$ 的路径,因此我们返回 $root$。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点个数。
5967

6068
<!-- tabs:start -->
6169

solution/1000-1099/1086.High Five/README.md

Lines changed: 88 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ ID = 2 的学生分数为 93、97、77、100 和 76 。前五科的平均分 (10
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50-
“桶排序 + 小根堆”实现。
50+
**方法一:排序**
51+
52+
我们先用一个哈希表或数组 $d$ 记录每个学生的分数列表,然后从小到大遍历学生的编号,对于每个学生,我们将他的分数列表排序,然后取最高的五个分数求平均值即可。
53+
54+
时间复杂度 $O(n \log n)$,空间复杂度 $O(n)$。其中 $n$ 是学生的数量。
5155

5256
<!-- tabs:start -->
5357

@@ -58,18 +62,17 @@ ID = 2 的学生分数为 93、97、77、100 和 76 。前五科的平均分 (10
5862
```python
5963
class Solution:
6064
def highFive(self, items: List[List[int]]) -> List[List[int]]:
61-
s = [None] * 101
62-
for i, score in items:
63-
if s[i] is None:
64-
s[i] = []
65-
s[i].append(score)
66-
res = []
67-
for i, scores in enumerate(s):
68-
if scores is None:
69-
continue
70-
avg = sum(nlargest(5, scores)) // 5
71-
res.append([i, avg])
72-
return res
65+
d = defaultdict(list)
66+
m = 0
67+
for i, x in items:
68+
d[i].append(x)
69+
m = max(m, i)
70+
ans = []
71+
for i in range(1, m + 1):
72+
if xs := d[i]:
73+
avg = sum(nlargest(5, xs)) // 5
74+
ans.append([i, avg])
75+
return ans
7376
```
7477

7578
### **Java**
@@ -116,6 +119,78 @@ class Solution {
116119
}
117120
```
118121

122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
vector<vector<int>> highFive(vector<vector<int>>& items) {
128+
vector<int> d[1001];
129+
for (auto& item : items) {
130+
int i = item[0], x = item[1];
131+
d[i].push_back(x);
132+
}
133+
vector<vector<int>> ans;
134+
for (int i = 1; i <= 1000; ++i) {
135+
if (!d[i].empty()) {
136+
sort(d[i].begin(), d[i].end(), greater<int>());
137+
int s = 0;
138+
for (int j = 0; j < 5; ++j) {
139+
s += d[i][j];
140+
}
141+
ans.push_back({i, s / 5});
142+
}
143+
}
144+
return ans;
145+
}
146+
};
147+
```
148+
149+
### **Go**
150+
151+
```go
152+
func highFive(items [][]int) (ans [][]int) {
153+
d := make([][]int, 1001)
154+
for _, item := range items {
155+
i, x := item[0], item[1]
156+
d[i] = append(d[i], x)
157+
}
158+
for i := 1; i <= 1000; i++ {
159+
if len(d[i]) > 0 {
160+
sort.Ints(d[i])
161+
s := 0
162+
for j := len(d[i]) - 1; j >= len(d[i])-5; j-- {
163+
s += d[i][j]
164+
}
165+
ans = append(ans, []int{i, s / 5})
166+
}
167+
}
168+
return ans
169+
}
170+
```
171+
172+
### **TypeScript**
173+
174+
```ts
175+
function highFive(items: number[][]): number[][] {
176+
const d: number[][] = Array(1001)
177+
.fill(0)
178+
.map(() => Array(0));
179+
for (const [i, x] of items) {
180+
d[i].push(x);
181+
}
182+
const ans: number[][] = [];
183+
for (let i = 1; i <= 1000; ++i) {
184+
if (d[i].length > 0) {
185+
d[i].sort((a, b) => b - a);
186+
const s = d[i].slice(0, 5).reduce((a, b) => a + b);
187+
ans.push([i, Math.floor(s / 5)]);
188+
}
189+
}
190+
return ans;
191+
}
192+
```
193+
119194
### **...**
120195

121196
```

solution/1000-1099/1086.High Five/README_EN.md

Lines changed: 97 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -48,59 +48,118 @@ The student with ID = 2 got scores 93, 97, 77, 100, and 76. Their top five avera
4848
```python
4949
class Solution:
5050
def highFive(self, items: List[List[int]]) -> List[List[int]]:
51-
s = [None] * 101
52-
for i, score in items:
53-
if s[i] is None:
54-
s[i] = []
55-
s[i].append(score)
56-
res = []
57-
for i, scores in enumerate(s):
58-
if scores is None:
59-
continue
60-
avg = sum(nlargest(5, scores)) // 5
61-
res.append([i, avg])
62-
return res
51+
d = defaultdict(list)
52+
m = 0
53+
for i, x in items:
54+
d[i].append(x)
55+
m = max(m, i)
56+
ans = []
57+
for i in range(1, m + 1):
58+
if xs := d[i]:
59+
avg = sum(nlargest(5, xs)) // 5
60+
ans.append([i, avg])
61+
return ans
6362
```
6463

6564
### **Java**
6665

6766
```java
6867
class Solution {
6968
public int[][] highFive(int[][] items) {
70-
int size = 0;
71-
PriorityQueue[] s = new PriorityQueue[101];
72-
int n = 5;
73-
for (int[] item : items) {
74-
int i = item[0], score = item[1];
75-
if (s[i] == null) {
76-
++size;
77-
s[i] = new PriorityQueue<>(n);
78-
}
79-
s[i].offer(score);
80-
if (s[i].size() > n) {
81-
s[i].poll();
69+
List<Integer>[] d = new List[1001];
70+
Arrays.setAll(d, k -> new ArrayList<>());
71+
for (var item : items) {
72+
int i = item[0], x = item[1];
73+
d[i].add(x);
74+
}
75+
for (var xs : d) {
76+
xs.sort((a, b) -> b - a);
77+
}
78+
List<int[]> ans = new ArrayList<>();
79+
for (int i = 1; i <= 1000; ++i) {
80+
var xs = d[i];
81+
if (!xs.isEmpty()) {
82+
int s = 0;
83+
for (int j = 0; j < 5; ++j) {
84+
s += xs.get(j);
85+
}
86+
ans.add(new int[]{i, s / 5});
8287
}
8388
}
84-
int[][] res = new int[size][2];
85-
int j = 0;
86-
for (int i = 0; i < 101; ++i) {
87-
if (s[i] == null) {
88-
continue;
89+
return ans.toArray(new int[0][]);
90+
}
91+
}
92+
```
93+
94+
### **C++**
95+
96+
```cpp
97+
class Solution {
98+
public:
99+
vector<vector<int>> highFive(vector<vector<int>>& items) {
100+
vector<int> d[1001];
101+
for (auto& item : items) {
102+
int i = item[0], x = item[1];
103+
d[i].push_back(x);
104+
}
105+
vector<vector<int>> ans;
106+
for (int i = 1; i <= 1000; ++i) {
107+
if (!d[i].empty()) {
108+
sort(d[i].begin(), d[i].end(), greater<int>());
109+
int s = 0;
110+
for (int j = 0; j < 5; ++j) {
111+
s += d[i][j];
112+
}
113+
ans.push_back({i, s / 5});
89114
}
90-
int avg = sum(s[i]) / n;
91-
res[j][0] = i;
92-
res[j++][1] = avg;
93115
}
94-
return res;
116+
return ans;
95117
}
118+
};
119+
```
120+
121+
### **Go**
122+
123+
```go
124+
func highFive(items [][]int) (ans [][]int) {
125+
d := make([][]int, 1001)
126+
for _, item := range items {
127+
i, x := item[0], item[1]
128+
d[i] = append(d[i], x)
129+
}
130+
for i := 1; i <= 1000; i++ {
131+
if len(d[i]) > 0 {
132+
sort.Ints(d[i])
133+
s := 0
134+
for j := len(d[i]) - 1; j >= len(d[i])-5; j-- {
135+
s += d[i][j]
136+
}
137+
ans = append(ans, []int{i, s / 5})
138+
}
139+
}
140+
return ans
141+
}
142+
```
96143

97-
private int sum(PriorityQueue<Integer> q) {
98-
int s = 0;
99-
while (!q.isEmpty()) {
100-
s += q.poll();
144+
### **TypeScript**
145+
146+
```ts
147+
function highFive(items: number[][]): number[][] {
148+
const d: number[][] = Array(1001)
149+
.fill(0)
150+
.map(() => Array(0));
151+
for (const [i, x] of items) {
152+
d[i].push(x);
153+
}
154+
const ans: number[][] = [];
155+
for (let i = 1; i <= 1000; ++i) {
156+
if (d[i].length > 0) {
157+
d[i].sort((a, b) => b - a);
158+
const s = d[i].slice(0, 5).reduce((a, b) => a + b);
159+
ans.push([i, Math.floor(s / 5)]);
101160
}
102-
return s;
103161
}
162+
return ans;
104163
}
105164
```
106165

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> highFive(vector<vector<int>>& items) {
4+
vector<int> d[1001];
5+
for (auto& item : items) {
6+
int i = item[0], x = item[1];
7+
d[i].push_back(x);
8+
}
9+
vector<vector<int>> ans;
10+
for (int i = 1; i <= 1000; ++i) {
11+
if (!d[i].empty()) {
12+
sort(d[i].begin(), d[i].end(), greater<int>());
13+
int s = 0;
14+
for (int j = 0; j < 5; ++j) {
15+
s += d[i][j];
16+
}
17+
ans.push_back({i, s / 5});
18+
}
19+
}
20+
return ans;
21+
}
22+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func highFive(items [][]int) (ans [][]int) {
2+
d := make([][]int, 1001)
3+
for _, item := range items {
4+
i, x := item[0], item[1]
5+
d[i] = append(d[i], x)
6+
}
7+
for i := 1; i <= 1000; i++ {
8+
if len(d[i]) > 0 {
9+
sort.Ints(d[i])
10+
s := 0
11+
for j := len(d[i]) - 1; j >= len(d[i])-5; j-- {
12+
s += d[i][j]
13+
}
14+
ans = append(ans, []int{i, s / 5})
15+
}
16+
}
17+
return ans
18+
}
Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,25 @@
11
class Solution {
22
public int[][] highFive(int[][] items) {
3-
int size = 0;
4-
PriorityQueue[] s = new PriorityQueue[101];
5-
int n = 5;
6-
for (int[] item : items) {
7-
int i = item[0], score = item[1];
8-
if (s[i] == null) {
9-
++size;
10-
s[i] = new PriorityQueue<>(n);
11-
}
12-
s[i].offer(score);
13-
if (s[i].size() > n) {
14-
s[i].poll();
15-
}
3+
List<Integer>[] d = new List[1001];
4+
Arrays.setAll(d, k -> new ArrayList<>());
5+
for (var item : items) {
6+
int i = item[0], x = item[1];
7+
d[i].add(x);
168
}
17-
int[][] res = new int[size][2];
18-
int j = 0;
19-
for (int i = 0; i < 101; ++i) {
20-
if (s[i] == null) {
21-
continue;
22-
}
23-
int avg = sum(s[i]) / n;
24-
res[j][0] = i;
25-
res[j++][1] = avg;
9+
for (var xs : d) {
10+
xs.sort((a, b) -> b - a);
2611
}
27-
return res;
28-
}
29-
30-
private int sum(PriorityQueue<Integer> q) {
31-
int s = 0;
32-
while (!q.isEmpty()) {
33-
s += q.poll();
12+
List<int[]> ans = new ArrayList<>();
13+
for (int i = 1; i <= 1000; ++i) {
14+
var xs = d[i];
15+
if (!xs.isEmpty()) {
16+
int s = 0;
17+
for (int j = 0; j < 5; ++j) {
18+
s += xs.get(j);
19+
}
20+
ans.add(new int[]{i, s / 5});
21+
}
3422
}
35-
return s;
23+
return ans.toArray(new int[0][]);
3624
}
3725
}

0 commit comments

Comments
 (0)