@@ -71,22 +71,22 @@ class Solution:
71
71
def findOrder (self , numCourses : int , prerequisites : List[List[int ]]) -> List[int ]:
72
72
edges = defaultdict(list )
73
73
indegree = [0 ] * numCourses
74
- for i, j in prerequisites:
75
- edges[j ].append(i )
76
- indegree[i ] += 1
74
+ for a, b in prerequisites:
75
+ edges[b ].append(a )
76
+ indegree[a ] += 1
77
77
q = deque()
78
78
for i in range (numCourses):
79
79
if indegree[i] == 0 :
80
80
q.append(i)
81
- res = []
81
+ ans = []
82
82
while q:
83
- i = q.popleft()
84
- res .append(i )
85
- for j in edges[i ]:
86
- indegree[j ] -= 1
87
- if indegree[j ] == 0 :
88
- q.append(j )
89
- return res if len (res ) == numCourses else []
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 []
90
90
```
91
91
92
92
### ** Java**
@@ -102,32 +102,65 @@ class Solution {
102
102
}
103
103
int [] indegree = new int [numCourses];
104
104
for (int [] p : prerequisites) {
105
- edges[p[1 ]]. add(p[0 ]);
106
- ++ indegree[p[0 ]];
105
+ int a = p[0 ], b = p[1 ];
106
+ edges[b]. add(a);
107
+ ++ indegree[a];
107
108
}
108
109
Queue<Integer > q = new LinkedList<> ();
109
110
for (int i = 0 ; i < numCourses; ++ i) {
110
111
if (indegree[i] == 0 ) {
111
112
q. offer(i);
112
113
}
113
114
}
114
- int [] res = new int [numCourses];
115
- int cnt = 0 ;
115
+ int [] ans = new int [numCourses];
116
+ int n = 0 ;
116
117
while (! q. isEmpty()) {
117
- int i = q. poll();
118
- res[cnt++ ] = i;
119
- for (int j : edges[i]) {
120
- -- indegree[j];
121
- if (indegree[j] == 0 ) {
122
- q. offer(j);
118
+ int b = q. poll();
119
+ ans[n++ ] = b;
120
+ for (int a : edges[b]) {
121
+ if (-- indegree[a] == 0 ) {
122
+ q. offer(a);
123
123
}
124
124
}
125
125
}
126
- return cnt == numCourses ? res : new int [0 ];
126
+ return n == numCourses ? ans : new int [0 ];
127
127
}
128
128
}
129
129
```
130
130
131
+ ### ** TypeScript**
132
+
133
+ ``` ts
134
+ function findOrder(numCourses : number , prerequisites : number [][]): number [] {
135
+ let edges = Array .from ({ length: numCourses }, () => []);
136
+ let indeg = new Array (numCourses ).fill (0 );
137
+ for (let [b, a] of prerequisites ) {
138
+ edges [a ].push (b );
139
+ indeg [b ] += 1 ;
140
+ }
141
+
142
+ let queue = [];
143
+ for (let i = 0 ; i < numCourses ; i ++ ) {
144
+ if (! indeg [i ]) {
145
+ queue .push (i );
146
+ }
147
+ }
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 );
157
+ }
158
+ }
159
+ }
160
+ return ans .length == numCourses ? ans : [];
161
+ }
162
+ ```
163
+
131
164
### ** C++**
132
165
133
166
``` cpp
@@ -136,29 +169,27 @@ public:
136
169
vector<int > findOrder(int numCourses, vector<vector<int >>& prerequisites) {
137
170
vector<vector<int >> edges(numCourses);
138
171
vector<int > indegree(numCourses);
139
- for (auto p : prerequisites)
172
+ for (auto& p : prerequisites)
140
173
{
141
- edges[ p[ 1]] .push_back(p[ 0] );
142
- ++indegree[ p[ 0]] ;
174
+ int a = p[ 0] , b = p[ 1] ;
175
+ edges[ b] .push_back(a);
176
+ ++indegree[ a] ;
143
177
}
144
178
queue<int > q;
145
179
for (int i = 0; i < numCourses; ++i)
146
- {
147
- if (indegree[ i] == 0) q.push(i);
148
- }
149
- vector<int > res;
180
+ if (indegree[ i] == 0)
181
+ q.push(i);
182
+ vector<int > ans;
150
183
while (!q.empty())
151
184
{
152
- int i = q.front();
185
+ int b = q.front();
153
186
q.pop();
154
- res.push_back(i);
155
- for (int j : edges[ i] )
156
- {
157
- --indegree[ j] ;
158
- if (indegree[ j] == 0) q.push(j);
159
- }
187
+ ans.push_back(b);
188
+ for (int a : edges[ b] )
189
+ if (--indegree[ a] == 0)
190
+ q.push(a);
160
191
}
161
- return res .size() == numCourses ? res : vector<int >();
192
+ return ans .size() == numCourses ? ans : vector<int >();
162
193
}
163
194
};
164
195
```
@@ -170,29 +201,30 @@ func findOrder(numCourses int, prerequisites [][]int) []int {
170
201
edges := make([][]int, numCourses)
171
202
indegree := make([]int, numCourses)
172
203
for _, p := range prerequisites {
173
- edges[p[1]] = append(edges[p[1]], p[0])
174
- indegree[p[0]]++
204
+ a, b := p[0], p[1]
205
+ edges[b] = append(edges[b], a)
206
+ indegree[a]++
175
207
}
176
208
var q []int
177
209
for i := 0; i < numCourses; i++ {
178
210
if indegree[i] == 0 {
179
211
q = append(q, i)
180
212
}
181
213
}
182
- var res []int
214
+ var ans []int
183
215
for len(q) > 0 {
184
- i := q[0]
216
+ b := q[0]
185
217
q = q[1:]
186
- res = append(res, i )
187
- for _, j := range edges[i ] {
188
- indegree[j ]--
189
- if indegree[j ] == 0 {
190
- q = append(q, j )
218
+ ans = append(ans, b )
219
+ for _, a := range edges[b ] {
220
+ indegree[a ]--
221
+ if indegree[a ] == 0 {
222
+ q = append(q, a )
191
223
}
192
224
}
193
225
}
194
- if len(res ) == numCourses {
195
- return res
226
+ if len(ans ) == numCourses {
227
+ return ans
196
228
}
197
229
return []int{}
198
230
}
@@ -201,49 +233,38 @@ func findOrder(numCourses int, prerequisites [][]int) []int {
201
233
### ** C#**
202
234
203
235
``` cs
204
- using System .Collections .Generic ;
205
-
206
236
public class Solution {
207
237
public int [] FindOrder (int numCourses , int [][] prerequisites ) {
238
+ var edges = new List <int >[numCourses ];
239
+ for (int i = 0 ; i < numCourses ; ++ i )
240
+ {
241
+ edges [i ] = new List <int >();
242
+ }
208
243
var indegree = new int [numCourses ];
209
- var edgeCount = prerequisites .Length ;
210
- var edge = new List <int >[numCourses ];
211
- for (var i = 0 ; i < edgeCount ; ++ i )
244
+ for (int i = 0 ; i < prerequisites .Length ; ++ i )
212
245
{
213
- var child = prerequisites [i ][0 ];
214
- var parent = prerequisites [i ][1 ];
215
- if (edge [parent ] == null )
216
- {
217
- edge [parent ] = new List <int >();
218
- }
219
- edge [parent ].Add (child );
220
- ++ indegree [child ];
246
+ int a = prerequisites [i ][0 ];
247
+ int b = prerequisites [i ][1 ];
248
+ edges [b ].Add (a );
249
+ ++ indegree [a ];
221
250
}
222
-
223
- var queue = new Queue <int >();
224
- for (var i = 0 ; i < numCourses ; ++ i )
251
+ var q = new Queue <int >();
252
+ for (int i = 0 ; i < numCourses ; ++ i )
225
253
{
226
- if (indegree [i ] == 0 ) queue .Enqueue (i );
254
+ if (indegree [i ] == 0 ) q .Enqueue (i );
227
255
}
228
-
229
- var result = new int [numCourses ];
230
- var count = 0 ;
231
- while (queue .Count > 0 )
256
+ var ans = new int [numCourses ];
257
+ var n = 0 ;
258
+ while (q .Count > 0 )
232
259
{
233
- var node = queue .Dequeue ();
234
- result [ count ++ ] = node ;
235
- if ( edge [ node ] != null )
260
+ int b = q .Dequeue ();
261
+ ans [ n ++ ] = b ;
262
+ foreach ( int a in edges [ b ] )
236
263
{
237
- foreach (var next in edge [node ])
238
- {
239
- if (-- indegree [next ] == 0 )
240
- {
241
- queue .Enqueue (next );
242
- }
243
- }
264
+ if (-- indegree [a ] == 0 ) q .Enqueue (a );
244
265
}
245
266
}
246
- return count == numCourses ? result : new int [0 ];
267
+ return n == numCourses ? ans : new int [0 ];
247
268
}
248
269
}
249
270
```
0 commit comments