Skip to content

Commit 0f60d85

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 0f60d85

File tree

23 files changed

+641
-737
lines changed

23 files changed

+641
-737
lines changed

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

Lines changed: 92 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61-
拓扑排序,BFS 实现。
61+
**方法一:拓扑排序**
62+
63+
BFS 实现。
6264

6365
<!-- tabs:start -->
6466

@@ -68,25 +70,22 @@
6870

6971
```python
7072
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
7476
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])
8281
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
9089
```
9190

9291
### **Java**
@@ -95,69 +94,65 @@ class Solution:
9594

9695
```java
9796
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];
10099
for (int i = 0; i < numCourses; ++i) {
101-
edges[i] = new ArrayList<>();
100+
g[i] = new ArrayList<>();
102101
}
103-
int[] indegree = new int[numCourses];
104-
for (int[] p : prerequisites) {
102+
int[] indeg = new int[numCourses];
103+
for (var p : prerequisites) {
105104
int a = p[0], b = p[1];
106-
edges[b].add(a);
107-
++indegree[a];
105+
g[b].add(a);
106+
++indeg[a];
108107
}
109-
Queue<Integer> q = new LinkedList<>();
108+
Deque<Integer> q = new ArrayDeque<>();
110109
for (int i = 0; i < numCourses; ++i) {
111-
if (indegree[i] == 0) {
110+
if (indeg[i] == 0) {
112111
q.offer(i);
113112
}
114113
}
115-
int[] ans = new int[numCourses];
116-
int n = 0;
114+
int cnt = 0;
117115
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);
123121
}
124122
}
125123
}
126-
return n == numCourses ? ans : new int[0];
124+
return cnt == numCourses;
127125
}
128126
}
129127
```
130128

131-
### **TypeScript**
129+
### **TypeScrpt**
132130

133131
```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 }, () => []);
136134
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];
140138
}
141-
142-
let queue = [];
143-
for (let i = 0; i < numCourses; i++) {
139+
let q = [];
140+
for (let i = 0; i < numCourses; ++i) {
144141
if (!indeg[i]) {
145-
queue.push(i);
142+
q.push(i);
146143
}
147144
}
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);
157152
}
158153
}
159154
}
160-
return ans.length == numCourses ? ans : [];
155+
return cnt == numCourses;
161156
}
162157
```
163158

@@ -166,105 +161,96 @@ function findOrder(numCourses: number, prerequisites: number[][]): number[] {
166161
```cpp
167162
class Solution {
168163
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);
172167
for (auto& p : prerequisites)
173168
{
174169
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];
177172
}
178173
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;
183176
while (!q.empty())
184177
{
185-
int b = q.front();
178+
int i = q.front();
186179
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);
191182
}
192-
return ans.size() == numCourses ? ans : vector<int>();
183+
return cnt == numCourses;
193184
}
194185
};
195186
```
196187
197188
### **Go**
198189
199190
```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)
203194
for _, p := range prerequisites {
204195
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]++
207198
}
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 {
211202
q = append(q, i)
212203
}
213204
}
214-
var ans []int
205+
cnt := 0
215206
for len(q) > 0 {
216-
b := q[0]
207+
i := q[0]
217208
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)
223214
}
224215
}
225216
}
226-
if len(ans) == numCourses {
227-
return ans
228-
}
229-
return []int{}
217+
return cnt == numCourses
230218
}
231219
```
232220

233221
### **C#**
234222

235223
```cs
236224
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];
239227
for (int i = 0; i < numCourses; ++i)
240228
{
241-
edges[i] = new List<int>();
229+
g[i] = new List<int>();
242230
}
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)
245233
{
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];
250237
}
251238
var q = new Queue<int>();
252239
for (int i = 0; i < numCourses; ++i)
253240
{
254-
if (indegree[i] == 0) q.Enqueue(i);
241+
if (indeg[i] == 0) q.Enqueue(i);
255242
}
256-
var ans = new int[numCourses];
257-
var n = 0;
243+
var cnt = 0;
258244
while (q.Count > 0)
259245
{
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])
263249
{
264-
if (--indegree[a] == 0) q.Enqueue(a);
250+
if (--indeg[j] == 0) q.Enqueue(j);
265251
}
266252
}
267-
return n == numCourses ? ans : new int[0];
253+
return cnt == numCourses;
268254
}
269255
}
270256
```

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

Lines changed: 8 additions & 14 deletions
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
}
Lines changed: 14 additions & 15 deletions
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
}

0 commit comments

Comments
 (0)