Skip to content

Commit d93e676

Browse files
committed
feat: update solutions to lc/lcof2 problems
* lc No.0207.Course Schedule * lc No.0210.Course Schedule II * lcof2 No.113.Course Schedule II
1 parent 9405562 commit d93e676

23 files changed

+624
-717
lines changed

lcof2/剑指 Offer II 113. 课程顺序/README.md

+75-86
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,20 @@
6969
```python
7070
class Solution:
7171
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
7474
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])
8178
ans = []
8279
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)
8986
return ans if len(ans) == numCourses else []
9087
```
9188

@@ -96,34 +93,34 @@ class Solution:
9693
```java
9794
class Solution {
9895
public int[] findOrder(int numCourses, int[][] prerequisites) {
99-
List<Integer>[] edges = new List[numCourses];
96+
List<Integer>[] g = new List[numCourses];
10097
for (int i = 0; i < numCourses; ++i) {
101-
edges[i] = new ArrayList<>();
98+
g[i] = new ArrayList<>();
10299
}
103-
int[] indegree = new int[numCourses];
104-
for (int[] p : prerequisites) {
100+
int[] indeg = new int[numCourses];
101+
for (var p : prerequisites) {
105102
int a = p[0], b = p[1];
106-
edges[b].add(a);
107-
++indegree[a];
103+
g[b].add(a);
104+
++indeg[a];
108105
}
109-
Queue<Integer> q = new LinkedList<>();
106+
Deque<Integer> q = new ArrayDeque<>();
110107
for (int i = 0; i < numCourses; ++i) {
111-
if (indegree[i] == 0) {
108+
if (indeg[i] == 0) {
112109
q.offer(i);
113110
}
114111
}
115112
int[] ans = new int[numCourses];
116-
int n = 0;
113+
int cnt = 0;
117114
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);
123120
}
124121
}
125122
}
126-
return n == numCourses ? ans : new int[0];
123+
return cnt == numCourses ? ans : new int[0];
127124
}
128125
}
129126
```
@@ -132,28 +129,25 @@ class Solution {
132129

133130
```ts
134131
function findOrder(numCourses: number, prerequisites: number[][]): number[] {
135-
let edges = Array.from({ length: numCourses }, () => []);
132+
let g = Array.from({ length: numCourses }, () => []);
136133
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];
140137
}
141-
142-
let queue = [];
143-
for (let i = 0; i < numCourses; i++) {
138+
let q = [];
139+
for (let i = 0; i < numCourses; ++i) {
144140
if (!indeg[i]) {
145-
queue.push(i);
141+
q.push(i);
146142
}
147143
}
148-
149144
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);
157151
}
158152
}
159153
}
@@ -167,27 +161,23 @@ function findOrder(numCourses: number, prerequisites: number[][]): number[] {
167161
class Solution {
168162
public:
169163
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);
172166
for (auto& p : prerequisites)
173167
{
174168
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];
177171
}
178172
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);
182174
vector<int> ans;
183175
while (!q.empty())
184176
{
185-
int b = q.front();
177+
int i = q.front();
186178
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);
191181
}
192182
return ans.size() == numCourses ? ans : vector<int>();
193183
}
@@ -198,28 +188,28 @@ public:
198188
199189
```go
200190
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)
203193
for _, p := range prerequisites {
204194
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]++
207197
}
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 {
211201
q = append(q, i)
212202
}
213203
}
214-
var ans []int
204+
ans := []int{}
215205
for len(q) > 0 {
216-
b := q[0]
206+
i := q[0]
217207
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)
223213
}
224214
}
225215
}
@@ -235,36 +225,35 @@ func findOrder(numCourses int, prerequisites [][]int) []int {
235225
```cs
236226
public class Solution {
237227
public int[] FindOrder(int numCourses, int[][] prerequisites) {
238-
var edges = new List<int>[numCourses];
228+
var g = new List<int>[numCourses];
239229
for (int i = 0; i < numCourses; ++i)
240230
{
241-
edges[i] = new List<int>();
231+
g[i] = new List<int>();
242232
}
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)
245235
{
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];
250239
}
251240
var q = new Queue<int>();
252241
for (int i = 0; i < numCourses; ++i)
253242
{
254-
if (indegree[i] == 0) q.Enqueue(i);
243+
if (indeg[i] == 0) q.Enqueue(i);
255244
}
256245
var ans = new int[numCourses];
257-
var n = 0;
246+
var cnt = 0;
258247
while (q.Count > 0)
259248
{
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])
263252
{
264-
if (--indegree[a] == 0) q.Enqueue(a);
253+
if (--indeg[j] == 0) q.Enqueue(j);
265254
}
266255
}
267-
return n == numCourses ? ans : new int[0];
256+
return cnt == numCourses ? ans : new int[0];
268257
}
269258
}
270259
```

lcof2/剑指 Offer II 113. 课程顺序/Solution.cpp

+8-14
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,23 @@
11
class Solution {
22
public:
33
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
4-
vector<vector<int>> edges(numCourses);
5-
vector<int> indegree(numCourses);
4+
vector<vector<int>> g(numCourses);
5+
vector<int> indeg(numCourses);
66
for (auto& p : prerequisites)
77
{
88
int a = p[0], b = p[1];
9-
edges[b].push_back(a);
10-
++indegree[a];
9+
g[b].push_back(a);
10+
++indeg[a];
1111
}
1212
queue<int> q;
13-
for (int i = 0; i < numCourses; ++i)
14-
if (indegree[i] == 0)
15-
q.push(i);
13+
for (int i = 0; i < numCourses; ++i) if (indeg[i] == 0) q.push(i);
1614
vector<int> ans;
1715
while (!q.empty())
1816
{
19-
int b = q.front();
17+
int i = q.front();
2018
q.pop();
21-
ans.push_back(b);
22-
for (int a : edges[b])
23-
{
24-
--indegree[a];
25-
if (indegree[a] == 0) q.push(a);
26-
}
19+
ans.push_back(i);
20+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
2721
}
2822
return ans.size() == numCourses ? ans : vector<int>();
2923
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,33 @@
11
public class Solution {
22
public int[] FindOrder(int numCourses, int[][] prerequisites) {
3-
var edges = new List<int>[numCourses];
3+
var g = new List<int>[numCourses];
44
for (int i = 0; i < numCourses; ++i)
55
{
6-
edges[i] = new List<int>();
6+
g[i] = new List<int>();
77
}
8-
var indegree = new int[numCourses];
9-
for (int i = 0; i < prerequisites.Length; ++i)
8+
var indeg = new int[numCourses];
9+
foreach (var p in prerequisites)
1010
{
11-
int a = prerequisites[i][0];
12-
int b = prerequisites[i][1];
13-
edges[b].Add(a);
14-
++indegree[a];
11+
int a = p[0], b = p[1];
12+
g[b].Add(a);
13+
++indeg[a];
1514
}
1615
var q = new Queue<int>();
1716
for (int i = 0; i < numCourses; ++i)
1817
{
19-
if (indegree[i] == 0) q.Enqueue(i);
18+
if (indeg[i] == 0) q.Enqueue(i);
2019
}
2120
var ans = new int[numCourses];
22-
var n = 0;
21+
var cnt = 0;
2322
while (q.Count > 0)
2423
{
25-
int b = q.Dequeue();
26-
ans[n++] = b;
27-
foreach (int a in edges[b])
24+
int i = q.Dequeue();
25+
ans[cnt++] = i;
26+
foreach (int j in g[i])
2827
{
29-
if (--indegree[a] == 0) q.Enqueue(a);
28+
if (--indeg[j] == 0) q.Enqueue(j);
3029
}
3130
}
32-
return n == numCourses ? ans : new int[0];
31+
return cnt == numCourses ? ans : new int[0];
3332
}
3433
}

lcof2/剑指 Offer II 113. 课程顺序/Solution.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
func findOrder(numCourses int, prerequisites [][]int) []int {
2-
edges := make([][]int, numCourses)
3-
indegree := make([]int, numCourses)
2+
g := make([][]int, numCourses)
3+
indeg := make([]int, numCourses)
44
for _, p := range prerequisites {
55
a, b := p[0], p[1]
6-
edges[b] = append(edges[b], a)
7-
indegree[a]++
6+
g[b] = append(g[b], a)
7+
indeg[a]++
88
}
9-
var q []int
10-
for i := 0; i < numCourses; i++ {
11-
if indegree[i] == 0 {
9+
q := []int{}
10+
for i, v := range indeg {
11+
if v == 0 {
1212
q = append(q, i)
1313
}
1414
}
15-
var ans []int
15+
ans := []int{}
1616
for len(q) > 0 {
17-
b := q[0]
17+
i := q[0]
1818
q = q[1:]
19-
ans = append(ans, b)
20-
for _, a := range edges[b] {
21-
indegree[a]--
22-
if indegree[a] == 0 {
23-
q = append(q, a)
19+
ans = append(ans, i)
20+
for _, j := range g[i] {
21+
indeg[j]--
22+
if indeg[j] == 0 {
23+
q = append(q, j)
2424
}
2525
}
2626
}

0 commit comments

Comments
 (0)