57
57
58
58
** 方法一:拓扑排序**
59
59
60
+ 我们可以先将课程之间的先修关系建立图 $g$,并统计每个课程的入度 $indeg$。
61
+
62
+ 然后我们将入度为 $0$ 的课程入队,然后开始进行拓扑排序。每次从队列中取出一个课程,将其出队,并将其出度的课程的入度减 $1$,如果减 $1$ 后入度为 $0$,则将该课程入队。当队列为空时,如果还有课程没有修完,则说明无法修完所有课程,返回 $-1$。否则返回修完所有课程所需的学期数。
63
+
64
+ 时间复杂度 $O(n + m)$,空间复杂度 $O(n + m)$。其中 $n$ 和 $m$ 分别为课程数和先修关系数。
65
+
60
66
<!-- tabs:start -->
61
67
62
68
### ** Python3**
@@ -68,11 +74,12 @@ class Solution:
68
74
def minimumSemesters (self , n : int , relations : List[List[int ]]) -> int :
69
75
g = defaultdict(list )
70
76
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 )
74
82
ans = 0
75
- q = deque([i for i, v in enumerate (indeg) if v == 0 ])
76
83
while q:
77
84
ans += 1
78
85
for _ in range (len (q)):
@@ -95,10 +102,10 @@ class Solution {
95
102
List<Integer > [] g = new List [n];
96
103
Arrays . setAll(g, k - > new ArrayList<> ());
97
104
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 ];
102
109
}
103
110
Deque<Integer > q = new ArrayDeque<> ();
104
111
for (int i = 0 ; i < n; ++ i) {
@@ -133,22 +140,28 @@ public:
133
140
vector<vector<int >> g(n);
134
141
vector<int > indeg(n);
135
142
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 ] ;
139
146
}
140
147
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
+ }
143
153
int ans = 0;
144
154
while (!q.empty()) {
145
155
++ans;
146
156
for (int k = q.size(); k; --k) {
147
157
int i = q.front();
148
158
q.pop();
149
159
--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
+ }
152
165
}
153
166
}
154
167
return n == 0 ? ans : -1;
@@ -159,21 +172,20 @@ public:
159
172
### **Go**
160
173
161
174
```go
162
- func minimumSemesters(n int, relations [][]int) int {
175
+ func minimumSemesters(n int, relations [][]int) (ans int) {
163
176
g := make([][]int, n)
164
177
indeg := make([]int, n)
165
178
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 ]++
169
182
}
170
183
q := []int{}
171
184
for i, v := range indeg {
172
185
if v == 0 {
173
186
q = append(q, i)
174
187
}
175
188
}
176
- ans := 0
177
189
for len(q) > 0 {
178
190
ans++
179
191
for k := len(q); k > 0; k-- {
@@ -189,12 +201,45 @@ func minimumSemesters(n int, relations [][]int) int {
189
201
}
190
202
}
191
203
if n == 0 {
192
- return ans
204
+ return
193
205
}
194
206
return -1
195
207
}
196
208
```
197
209
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
+
198
243
### ** ...**
199
244
200
245
```
0 commit comments