Skip to content

Commit bdcfab5

Browse files
committed
feat: add solutions to lc problem: No.1136
No.1136.Parallel Courses
1 parent 6f22750 commit bdcfab5

File tree

7 files changed

+181
-63
lines changed

7 files changed

+181
-63
lines changed

solution/1100-1199/1136.Parallel Courses/README.md

+66-21
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757

5858
**方法一:拓扑排序**
5959

60+
我们可以先将课程之间的先修关系建立图 $g$,并统计每个课程的入度 $indeg$。
61+
62+
然后我们将入度为 $0$ 的课程入队,然后开始进行拓扑排序。每次从队列中取出一个课程,将其出队,并将其出度的课程的入度减 $1$,如果减 $1$ 后入度为 $0$,则将该课程入队。当队列为空时,如果还有课程没有修完,则说明无法修完所有课程,返回 $-1$。否则返回修完所有课程所需的学期数。
63+
64+
时间复杂度 $O(n + m)$,空间复杂度 $O(n + m)$。其中 $n$ 和 $m$ 分别为课程数和先修关系数。
65+
6066
<!-- tabs:start -->
6167

6268
### **Python3**
@@ -68,11 +74,12 @@ class Solution:
6874
def minimumSemesters(self, n: int, relations: List[List[int]]) -> int:
6975
g = defaultdict(list)
7076
indeg = [0] * n
71-
for a, b in relations:
72-
g[a - 1].append(b - 1)
73-
indeg[b - 1] += 1
77+
for prev, nxt in relations:
78+
prev, nxt = prev - 1, nxt - 1
79+
g[prev].append(nxt)
80+
indeg[nxt] += 1
81+
q = deque(i for i, v in enumerate(indeg) if v == 0)
7482
ans = 0
75-
q = deque([i for i, v in enumerate(indeg) if v == 0])
7683
while q:
7784
ans += 1
7885
for _ in range(len(q)):
@@ -95,10 +102,10 @@ class Solution {
95102
List<Integer>[] g = new List[n];
96103
Arrays.setAll(g, k -> new ArrayList<>());
97104
int[] indeg = new int[n];
98-
for (int[] r : relations) {
99-
int a = r[0] - 1, b = r[1] - 1;
100-
g[a].add(b);
101-
++indeg[b];
105+
for (var r : relations) {
106+
int prev = r[0] - 1, nxt = r[1] - 1;
107+
g[prev].add(nxt);
108+
++indeg[nxt];
102109
}
103110
Deque<Integer> q = new ArrayDeque<>();
104111
for (int i = 0; i < n; ++i) {
@@ -133,22 +140,28 @@ public:
133140
vector<vector<int>> g(n);
134141
vector<int> indeg(n);
135142
for (auto& r : relations) {
136-
int a = r[0] - 1, b = r[1] - 1;
137-
g[a].push_back(b);
138-
++indeg[b];
143+
int prev = r[0] - 1, nxt = r[1] - 1;
144+
g[prev].push_back(nxt);
145+
++indeg[nxt];
139146
}
140147
queue<int> q;
141-
for (int i = 0; i < n; ++i)
142-
if (indeg[i] == 0) q.push(i);
148+
for (int i = 0; i < n; ++i) {
149+
if (indeg[i] == 0) {
150+
q.push(i);
151+
}
152+
}
143153
int ans = 0;
144154
while (!q.empty()) {
145155
++ans;
146156
for (int k = q.size(); k; --k) {
147157
int i = q.front();
148158
q.pop();
149159
--n;
150-
for (int j : g[i])
151-
if (--indeg[j] == 0) q.push(j);
160+
for (int& j : g[i]) {
161+
if (--indeg[j] == 0) {
162+
q.push(j);
163+
}
164+
}
152165
}
153166
}
154167
return n == 0 ? ans : -1;
@@ -159,21 +172,20 @@ public:
159172
### **Go**
160173
161174
```go
162-
func minimumSemesters(n int, relations [][]int) int {
175+
func minimumSemesters(n int, relations [][]int) (ans int) {
163176
g := make([][]int, n)
164177
indeg := make([]int, n)
165178
for _, r := range relations {
166-
a, b := r[0]-1, r[1]-1
167-
g[a] = append(g[a], b)
168-
indeg[b]++
179+
prev, nxt := r[0]-1, r[1]-1
180+
g[prev] = append(g[prev], nxt)
181+
indeg[nxt]++
169182
}
170183
q := []int{}
171184
for i, v := range indeg {
172185
if v == 0 {
173186
q = append(q, i)
174187
}
175188
}
176-
ans := 0
177189
for len(q) > 0 {
178190
ans++
179191
for k := len(q); k > 0; k-- {
@@ -189,12 +201,45 @@ func minimumSemesters(n int, relations [][]int) int {
189201
}
190202
}
191203
if n == 0 {
192-
return ans
204+
return
193205
}
194206
return -1
195207
}
196208
```
197209

210+
### **TypeScript**
211+
212+
```ts
213+
function minimumSemesters(n: number, relations: number[][]): number {
214+
const g = Array.from({ length: n }, () => []);
215+
const indeg = new Array(n).fill(0);
216+
for (const [prev, nxt] of relations) {
217+
g[prev - 1].push(nxt - 1);
218+
indeg[nxt - 1]++;
219+
}
220+
const q: number[] = [];
221+
for (let i = 0; i < n; ++i) {
222+
if (indeg[i] === 0) {
223+
q.push(i);
224+
}
225+
}
226+
let ans = 0;
227+
while (q.length) {
228+
++ans;
229+
for (let k = q.length; k; --k) {
230+
const i = q.shift()!;
231+
--n;
232+
for (const j of g[i]) {
233+
if (--indeg[j] === 0) {
234+
q.push(j);
235+
}
236+
}
237+
}
238+
}
239+
return n === 0 ? ans : -1;
240+
}
241+
```
242+
198243
### **...**
199244

200245
```

solution/1100-1199/1136.Parallel Courses/README_EN.md

+60-21
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@ class Solution:
5252
def minimumSemesters(self, n: int, relations: List[List[int]]) -> int:
5353
g = defaultdict(list)
5454
indeg = [0] * n
55-
for a, b in relations:
56-
g[a - 1].append(b - 1)
57-
indeg[b - 1] += 1
55+
for prev, nxt in relations:
56+
prev, nxt = prev - 1, nxt - 1
57+
g[prev].append(nxt)
58+
indeg[nxt] += 1
59+
q = deque(i for i, v in enumerate(indeg) if v == 0)
5860
ans = 0
59-
q = deque([i for i, v in enumerate(indeg) if v == 0])
6061
while q:
6162
ans += 1
6263
for _ in range(len(q)):
@@ -77,10 +78,10 @@ class Solution {
7778
List<Integer>[] g = new List[n];
7879
Arrays.setAll(g, k -> new ArrayList<>());
7980
int[] indeg = new int[n];
80-
for (int[] r : relations) {
81-
int a = r[0] - 1, b = r[1] - 1;
82-
g[a].add(b);
83-
++indeg[b];
81+
for (var r : relations) {
82+
int prev = r[0] - 1, nxt = r[1] - 1;
83+
g[prev].add(nxt);
84+
++indeg[nxt];
8485
}
8586
Deque<Integer> q = new ArrayDeque<>();
8687
for (int i = 0; i < n; ++i) {
@@ -115,22 +116,28 @@ public:
115116
vector<vector<int>> g(n);
116117
vector<int> indeg(n);
117118
for (auto& r : relations) {
118-
int a = r[0] - 1, b = r[1] - 1;
119-
g[a].push_back(b);
120-
++indeg[b];
119+
int prev = r[0] - 1, nxt = r[1] - 1;
120+
g[prev].push_back(nxt);
121+
++indeg[nxt];
121122
}
122123
queue<int> q;
123-
for (int i = 0; i < n; ++i)
124-
if (indeg[i] == 0) q.push(i);
124+
for (int i = 0; i < n; ++i) {
125+
if (indeg[i] == 0) {
126+
q.push(i);
127+
}
128+
}
125129
int ans = 0;
126130
while (!q.empty()) {
127131
++ans;
128132
for (int k = q.size(); k; --k) {
129133
int i = q.front();
130134
q.pop();
131135
--n;
132-
for (int j : g[i])
133-
if (--indeg[j] == 0) q.push(j);
136+
for (int& j : g[i]) {
137+
if (--indeg[j] == 0) {
138+
q.push(j);
139+
}
140+
}
134141
}
135142
}
136143
return n == 0 ? ans : -1;
@@ -141,21 +148,20 @@ public:
141148
### **Go**
142149
143150
```go
144-
func minimumSemesters(n int, relations [][]int) int {
151+
func minimumSemesters(n int, relations [][]int) (ans int) {
145152
g := make([][]int, n)
146153
indeg := make([]int, n)
147154
for _, r := range relations {
148-
a, b := r[0]-1, r[1]-1
149-
g[a] = append(g[a], b)
150-
indeg[b]++
155+
prev, nxt := r[0]-1, r[1]-1
156+
g[prev] = append(g[prev], nxt)
157+
indeg[nxt]++
151158
}
152159
q := []int{}
153160
for i, v := range indeg {
154161
if v == 0 {
155162
q = append(q, i)
156163
}
157164
}
158-
ans := 0
159165
for len(q) > 0 {
160166
ans++
161167
for k := len(q); k > 0; k-- {
@@ -171,12 +177,45 @@ func minimumSemesters(n int, relations [][]int) int {
171177
}
172178
}
173179
if n == 0 {
174-
return ans
180+
return
175181
}
176182
return -1
177183
}
178184
```
179185

186+
### **TypeScript**
187+
188+
```ts
189+
function minimumSemesters(n: number, relations: number[][]): number {
190+
const g = Array.from({ length: n }, () => []);
191+
const indeg = new Array(n).fill(0);
192+
for (const [prev, nxt] of relations) {
193+
g[prev - 1].push(nxt - 1);
194+
indeg[nxt - 1]++;
195+
}
196+
const q: number[] = [];
197+
for (let i = 0; i < n; ++i) {
198+
if (indeg[i] === 0) {
199+
q.push(i);
200+
}
201+
}
202+
let ans = 0;
203+
while (q.length) {
204+
++ans;
205+
for (let k = q.length; k; --k) {
206+
const i = q.shift()!;
207+
--n;
208+
for (const j of g[i]) {
209+
if (--indeg[j] === 0) {
210+
q.push(j);
211+
}
212+
}
213+
}
214+
}
215+
return n === 0 ? ans : -1;
216+
}
217+
```
218+
180219
### **...**
181220

182221
```

solution/1100-1199/1136.Parallel Courses/Solution.cpp

+13-7
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,28 @@ class Solution {
44
vector<vector<int>> g(n);
55
vector<int> indeg(n);
66
for (auto& r : relations) {
7-
int a = r[0] - 1, b = r[1] - 1;
8-
g[a].push_back(b);
9-
++indeg[b];
7+
int prev = r[0] - 1, nxt = r[1] - 1;
8+
g[prev].push_back(nxt);
9+
++indeg[nxt];
1010
}
1111
queue<int> q;
12-
for (int i = 0; i < n; ++i)
13-
if (indeg[i] == 0) q.push(i);
12+
for (int i = 0; i < n; ++i) {
13+
if (indeg[i] == 0) {
14+
q.push(i);
15+
}
16+
}
1417
int ans = 0;
1518
while (!q.empty()) {
1619
++ans;
1720
for (int k = q.size(); k; --k) {
1821
int i = q.front();
1922
q.pop();
2023
--n;
21-
for (int j : g[i])
22-
if (--indeg[j] == 0) q.push(j);
24+
for (int& j : g[i]) {
25+
if (--indeg[j] == 0) {
26+
q.push(j);
27+
}
28+
}
2329
}
2430
}
2531
return n == 0 ? ans : -1;

solution/1100-1199/1136.Parallel Courses/Solution.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
func minimumSemesters(n int, relations [][]int) int {
1+
func minimumSemesters(n int, relations [][]int) (ans int) {
22
g := make([][]int, n)
33
indeg := make([]int, n)
44
for _, r := range relations {
5-
a, b := r[0]-1, r[1]-1
6-
g[a] = append(g[a], b)
7-
indeg[b]++
5+
prev, nxt := r[0]-1, r[1]-1
6+
g[prev] = append(g[prev], nxt)
7+
indeg[nxt]++
88
}
99
q := []int{}
1010
for i, v := range indeg {
1111
if v == 0 {
1212
q = append(q, i)
1313
}
1414
}
15-
ans := 0
1615
for len(q) > 0 {
1716
ans++
1817
for k := len(q); k > 0; k-- {
@@ -28,7 +27,7 @@ func minimumSemesters(n int, relations [][]int) int {
2827
}
2928
}
3029
if n == 0 {
31-
return ans
30+
return
3231
}
3332
return -1
3433
}

solution/1100-1199/1136.Parallel Courses/Solution.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ public int minimumSemesters(int n, int[][] relations) {
33
List<Integer>[] g = new List[n];
44
Arrays.setAll(g, k -> new ArrayList<>());
55
int[] indeg = new int[n];
6-
for (int[] r : relations) {
7-
int a = r[0] - 1, b = r[1] - 1;
8-
g[a].add(b);
9-
++indeg[b];
6+
for (var r : relations) {
7+
int prev = r[0] - 1, nxt = r[1] - 1;
8+
g[prev].add(nxt);
9+
++indeg[nxt];
1010
}
1111
Deque<Integer> q = new ArrayDeque<>();
1212
for (int i = 0; i < n; ++i) {

solution/1100-1199/1136.Parallel Courses/Solution.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ class Solution:
22
def minimumSemesters(self, n: int, relations: List[List[int]]) -> int:
33
g = defaultdict(list)
44
indeg = [0] * n
5-
for a, b in relations:
6-
g[a - 1].append(b - 1)
7-
indeg[b - 1] += 1
5+
for prev, nxt in relations:
6+
prev, nxt = prev - 1, nxt - 1
7+
g[prev].append(nxt)
8+
indeg[nxt] += 1
9+
q = deque(i for i, v in enumerate(indeg) if v == 0)
810
ans = 0
9-
q = deque([i for i, v in enumerate(indeg) if v == 0])
1011
while q:
1112
ans += 1
1213
for _ in range(len(q)):

0 commit comments

Comments
 (0)