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