58
58
59
59
<!-- 这里可写通用的实现逻辑 -->
60
60
61
- 拓扑排序,BFS 实现。
61
+ ** 方法一:拓扑排序**
62
+
63
+ BFS 实现。
62
64
63
65
<!-- tabs:start -->
64
66
68
70
69
71
``` python
70
72
class Solution :
71
- def findOrder (self , numCourses : int , prerequisites : List[List[int ]]) -> List[ int ] :
72
- edges = defaultdict(list )
73
- indegree = [0 ] * numCourses
73
+ def canFinish (self , numCourses : int , prerequisites : List[List[int ]]) -> bool :
74
+ g = defaultdict(list )
75
+ indeg = [0 ] * numCourses
74
76
for a, b in prerequisites:
75
- edges[b].append(a)
76
- indegree[a] += 1
77
- q = deque()
78
- for i in range (numCourses):
79
- if indegree[i] == 0 :
80
- q.append(i)
81
- ans = []
77
+ g[b].append(a)
78
+ indeg[a] += 1
79
+ cnt = 0
80
+ q = deque([i for i, v in enumerate (indeg) if v == 0 ])
82
81
while q:
83
- b = q.popleft()
84
- ans.append(b)
85
- for a in edges[b ]:
86
- indegree[a ] -= 1
87
- if indegree[a ] == 0 :
88
- q.append(a )
89
- return ans if len (ans) == numCourses else []
82
+ i = q.popleft()
83
+ cnt += 1
84
+ for j in g[i ]:
85
+ indeg[j ] -= 1
86
+ if indeg[j ] == 0 :
87
+ q.append(j )
88
+ return cnt == numCourses
90
89
```
91
90
92
91
### ** Java**
@@ -95,69 +94,65 @@ class Solution:
95
94
96
95
``` java
97
96
class Solution {
98
- public int [] findOrder (int numCourses , int [][] prerequisites ) {
99
- List<Integer > [] edges = new List [numCourses];
97
+ public boolean canFinish (int numCourses , int [][] prerequisites ) {
98
+ List<Integer > [] g = new List [numCourses];
100
99
for (int i = 0 ; i < numCourses; ++ i) {
101
- edges [i] = new ArrayList<> ();
100
+ g [i] = new ArrayList<> ();
102
101
}
103
- int [] indegree = new int [numCourses];
104
- for (int [] p : prerequisites) {
102
+ int [] indeg = new int [numCourses];
103
+ for (var p : prerequisites) {
105
104
int a = p[0 ], b = p[1 ];
106
- edges [b]. add(a);
107
- ++ indegree [a];
105
+ g [b]. add(a);
106
+ ++ indeg [a];
108
107
}
109
- Queue <Integer > q = new LinkedList <> ();
108
+ Deque <Integer > q = new ArrayDeque <> ();
110
109
for (int i = 0 ; i < numCourses; ++ i) {
111
- if (indegree [i] == 0 ) {
110
+ if (indeg [i] == 0 ) {
112
111
q. offer(i);
113
112
}
114
113
}
115
- int [] ans = new int [numCourses];
116
- int n = 0 ;
114
+ int cnt = 0 ;
117
115
while (! q. isEmpty()) {
118
- int b = q. poll();
119
- ans[n ++ ] = b ;
120
- for (int a : edges[b ]) {
121
- if (-- indegree[a ] == 0 ) {
122
- q. offer(a );
116
+ int i = q. poll();
117
+ ++ cnt ;
118
+ for (int j : g[i ]) {
119
+ if (-- indeg[j ] == 0 ) {
120
+ q. offer(j );
123
121
}
124
122
}
125
123
}
126
- return n == numCourses ? ans : new int [ 0 ] ;
124
+ return cnt == numCourses;
127
125
}
128
126
}
129
127
```
130
128
131
- ### ** TypeScript **
129
+ ### ** TypeScrpt **
132
130
133
131
``` ts
134
- function findOrder (numCourses : number , prerequisites : number [][]): number [] {
135
- let edges = Array .from ({ length: numCourses }, () => []);
132
+ function canFinish (numCourses : number , prerequisites : number [][]): boolean {
133
+ let g = Array .from ({ length: numCourses }, () => []);
136
134
let indeg = new Array (numCourses ).fill (0 );
137
- for (let [b, a ] of prerequisites ) {
138
- edges [ a ].push (b );
139
- indeg [b ] += 1 ;
135
+ for (let [a, b ] of prerequisites ) {
136
+ g [ b ].push (a );
137
+ ++ indeg [a ] ;
140
138
}
141
-
142
- let queue = [];
143
- for (let i = 0 ; i < numCourses ; i ++ ) {
139
+ let q = [];
140
+ for (let i = 0 ; i < numCourses ; ++ i ) {
144
141
if (! indeg [i ]) {
145
- queue .push (i );
142
+ q .push (i );
146
143
}
147
144
}
148
-
149
- let ans = [];
150
- while (queue .length ) {
151
- const u = queue .shift ();
152
- ans .push (u );
153
- for (let v of edges [u ]) {
154
- indeg [v ] -= 1 ;
155
- if (! indeg [v ]) {
156
- queue .push (v );
145
+ let cnt = 0 ;
146
+ while (q .length ) {
147
+ const i = q .shift ();
148
+ ++ cnt ;
149
+ for (let j of g [i ]) {
150
+ if (-- indeg [j ] == 0 ) {
151
+ q .push (j );
157
152
}
158
153
}
159
154
}
160
- return ans . length == numCourses ? ans : [] ;
155
+ return cnt == numCourses ;
161
156
}
162
157
```
163
158
@@ -166,105 +161,96 @@ function findOrder(numCourses: number, prerequisites: number[][]): number[] {
166
161
``` cpp
167
162
class Solution {
168
163
public:
169
- vector< int > findOrder (int numCourses, vector<vector<int >>& prerequisites) {
170
- vector<vector<int >> edges (numCourses);
171
- vector<int > indegree (numCourses);
164
+ bool canFinish (int numCourses, vector<vector<int >>& prerequisites) {
165
+ vector<vector<int >> g (numCourses);
166
+ vector<int > indeg (numCourses);
172
167
for (auto& p : prerequisites)
173
168
{
174
169
int a = p[ 0] , b = p[ 1] ;
175
- edges [ b] .push_back(a);
176
- ++indegree [ a] ;
170
+ g [ b] .push_back(a);
171
+ ++indeg [ a] ;
177
172
}
178
173
queue<int > q;
179
- for (int i = 0; i < numCourses; ++i)
180
- if (indegree[ i] == 0)
181
- q.push(i);
182
- vector<int > ans;
174
+ for (int i = 0; i < numCourses; ++i) if (indeg[ i] == 0) q.push(i);
175
+ int cnt = 0;
183
176
while (!q.empty())
184
177
{
185
- int b = q.front();
178
+ int i = q.front();
186
179
q.pop();
187
- ans.push_back(b);
188
- for (int a : edges[ b] )
189
- if (--indegree[ a] == 0)
190
- q.push(a);
180
+ ++cnt;
181
+ for (int j : g[ i] ) if (--indeg[ j] == 0) q.push(j);
191
182
}
192
- return ans.size() == numCourses ? ans : vector< int >() ;
183
+ return cnt == numCourses;
193
184
}
194
185
};
195
186
```
196
187
197
188
### **Go**
198
189
199
190
```go
200
- func findOrder (numCourses int, prerequisites [][]int) []int {
201
- edges := make([][]int, numCourses)
202
- indegree := make([]int, numCourses)
191
+ func canFinish (numCourses int, prerequisites [][]int) bool {
192
+ g := make([][]int, numCourses)
193
+ indeg := make([]int, numCourses)
203
194
for _, p := range prerequisites {
204
195
a, b := p[0], p[1]
205
- edges [b] = append(edges [b], a)
206
- indegree [a]++
196
+ g [b] = append(g [b], a)
197
+ indeg [a]++
207
198
}
208
- var q []int
209
- for i := 0; i < numCourses; i++ {
210
- if indegree[i] == 0 {
199
+ q := []int{}
200
+ for i, v := range indeg {
201
+ if v == 0 {
211
202
q = append(q, i)
212
203
}
213
204
}
214
- var ans []int
205
+ cnt := 0
215
206
for len(q) > 0 {
216
- b := q[0]
207
+ i := q[0]
217
208
q = q[1:]
218
- ans = append(ans, b)
219
- for _, a := range edges[b ] {
220
- indegree[a ]--
221
- if indegree[a ] == 0 {
222
- q = append(q, a )
209
+ cnt++
210
+ for _, j := range g[i ] {
211
+ indeg[j ]--
212
+ if indeg[j ] == 0 {
213
+ q = append(q, j )
223
214
}
224
215
}
225
216
}
226
- if len(ans) == numCourses {
227
- return ans
228
- }
229
- return []int{}
217
+ return cnt == numCourses
230
218
}
231
219
```
232
220
233
221
### ** C#**
234
222
235
223
``` cs
236
224
public class Solution {
237
- public int [] FindOrder (int numCourses , int [][] prerequisites ) {
238
- var edges = new List <int >[numCourses ];
225
+ public bool CanFinish (int numCourses , int [][] prerequisites ) {
226
+ var g = new List <int >[numCourses ];
239
227
for (int i = 0 ; i < numCourses ; ++ i )
240
228
{
241
- edges [i ] = new List <int >();
229
+ g [i ] = new List <int >();
242
230
}
243
- var indegree = new int [numCourses ];
244
- for ( int i = 0 ; i < prerequisites . Length ; ++ i )
231
+ var indeg = new int [numCourses ];
232
+ foreach ( var p in prerequisites )
245
233
{
246
- int a = prerequisites [i ][0 ];
247
- int b = prerequisites [i ][1 ];
248
- edges [b ].Add (a );
249
- ++ indegree [a ];
234
+ int a = p [0 ], b = p [1 ];
235
+ g [b ].Add (a );
236
+ ++ indeg [a ];
250
237
}
251
238
var q = new Queue <int >();
252
239
for (int i = 0 ; i < numCourses ; ++ i )
253
240
{
254
- if (indegree [i ] == 0 ) q .Enqueue (i );
241
+ if (indeg [i ] == 0 ) q .Enqueue (i );
255
242
}
256
- var ans = new int [numCourses ];
257
- var n = 0 ;
243
+ var cnt = 0 ;
258
244
while (q .Count > 0 )
259
245
{
260
- int b = q .Dequeue ();
261
- ans [ n ++ ] = b ;
262
- foreach (int a in edges [ b ])
246
+ int i = q .Dequeue ();
247
+ ++ cnt ;
248
+ foreach (int j in g [ i ])
263
249
{
264
- if (-- indegree [ a ] == 0 ) q .Enqueue (a );
250
+ if (-- indeg [ j ] == 0 ) q .Enqueue (j );
265
251
}
266
252
}
267
- return n == numCourses ? ans : new int [ 0 ] ;
253
+ return cnt == numCourses ;
268
254
}
269
255
}
270
256
```
0 commit comments