Skip to content

Commit 5a7484e

Browse files
committed
feat: add solutions to lc/lcof2 problems
* lc No.0802.Find Eventual Safe States * lcof2 No.113
1 parent 30501e4 commit 5a7484e

File tree

10 files changed

+307
-159
lines changed

10 files changed

+307
-159
lines changed

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

+101-80
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,22 @@ class Solution:
7171
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
7272
edges = defaultdict(list)
7373
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
7777
q = deque()
7878
for i in range(numCourses):
7979
if indegree[i] == 0:
8080
q.append(i)
81-
res = []
81+
ans = []
8282
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 []
9090
```
9191

9292
### **Java**
@@ -102,32 +102,65 @@ class Solution {
102102
}
103103
int[] indegree = new int[numCourses];
104104
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];
107108
}
108109
Queue<Integer> q = new LinkedList<>();
109110
for (int i = 0; i < numCourses; ++i) {
110111
if (indegree[i] == 0) {
111112
q.offer(i);
112113
}
113114
}
114-
int[] res = new int[numCourses];
115-
int cnt = 0;
115+
int[] ans = new int[numCourses];
116+
int n = 0;
116117
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);
123123
}
124124
}
125125
}
126-
return cnt == numCourses ? res : new int[0];
126+
return n == numCourses ? ans : new int[0];
127127
}
128128
}
129129
```
130130

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+
131164
### **C++**
132165

133166
```cpp
@@ -136,29 +169,27 @@ public:
136169
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
137170
vector<vector<int>> edges(numCourses);
138171
vector<int> indegree(numCourses);
139-
for (auto p : prerequisites)
172+
for (auto& p : prerequisites)
140173
{
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];
143177
}
144178
queue<int> q;
145179
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;
150183
while (!q.empty())
151184
{
152-
int i = q.front();
185+
int b = q.front();
153186
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);
160191
}
161-
return res.size() == numCourses ? res : vector<int>();
192+
return ans.size() == numCourses ? ans : vector<int>();
162193
}
163194
};
164195
```
@@ -170,29 +201,30 @@ func findOrder(numCourses int, prerequisites [][]int) []int {
170201
edges := make([][]int, numCourses)
171202
indegree := make([]int, numCourses)
172203
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]++
175207
}
176208
var q []int
177209
for i := 0; i < numCourses; i++ {
178210
if indegree[i] == 0 {
179211
q = append(q, i)
180212
}
181213
}
182-
var res []int
214+
var ans []int
183215
for len(q) > 0 {
184-
i := q[0]
216+
b := q[0]
185217
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)
191223
}
192224
}
193225
}
194-
if len(res) == numCourses {
195-
return res
226+
if len(ans) == numCourses {
227+
return ans
196228
}
197229
return []int{}
198230
}
@@ -201,49 +233,38 @@ func findOrder(numCourses int, prerequisites [][]int) []int {
201233
### **C#**
202234

203235
```cs
204-
using System.Collections.Generic;
205-
206236
public class Solution {
207237
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+
}
208243
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)
212245
{
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];
221250
}
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)
225253
{
226-
if (indegree[i] == 0) queue.Enqueue(i);
254+
if (indegree[i] == 0) q.Enqueue(i);
227255
}
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)
232259
{
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])
236263
{
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);
244265
}
245266
}
246-
return count == numCourses ? result : new int[0];
267+
return n == numCourses ? ans : new int[0];
247268
}
248269
}
249270
```

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

+13-13
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ class Solution {
33
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
44
vector<vector<int>> edges(numCourses);
55
vector<int> indegree(numCourses);
6-
for (auto p : prerequisites)
6+
for (auto& p : prerequisites)
77
{
8-
edges[p[1]].push_back(p[0]);
9-
++indegree[p[0]];
8+
int a = p[0], b = p[1];
9+
edges[b].push_back(a);
10+
++indegree[a];
1011
}
1112
queue<int> q;
1213
for (int i = 0; i < numCourses; ++i)
13-
{
14-
if (indegree[i] == 0) q.push(i);
15-
}
16-
vector<int> res;
14+
if (indegree[i] == 0)
15+
q.push(i);
16+
vector<int> ans;
1717
while (!q.empty())
1818
{
19-
int i = q.front();
19+
int b = q.front();
2020
q.pop();
21-
res.push_back(i);
22-
for (int j : edges[i])
21+
ans.push_back(b);
22+
for (int a : edges[b])
2323
{
24-
--indegree[j];
25-
if (indegree[j] == 0) q.push(j);
24+
--indegree[a];
25+
if (indegree[a] == 0) q.push(a);
2626
}
2727
}
28-
return res.size() == numCourses ? res : vector<int>();
28+
return ans.size() == numCourses ? ans : vector<int>();
2929
}
3030
};
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,34 @@
1-
using System.Collections.Generic;
2-
31
public class Solution {
42
public int[] FindOrder(int numCourses, int[][] prerequisites) {
3+
var edges = new List<int>[numCourses];
4+
for (int i = 0; i < numCourses; ++i)
5+
{
6+
edges[i] = new List<int>();
7+
}
58
var indegree = new int[numCourses];
6-
var edgeCount = prerequisites.Length;
7-
var edge = new List<int>[numCourses];
8-
for (var i = 0; i < edgeCount; ++i)
9+
for (int i = 0; i < prerequisites.Length; ++i)
910
{
10-
var child = prerequisites[i][0];
11-
var parent = prerequisites[i][1];
12-
if (edge[parent] == null)
13-
{
14-
edge[parent] = new List<int>();
15-
}
16-
edge[parent].Add(child);
17-
++indegree[child];
11+
int a = prerequisites[i][0];
12+
int b = prerequisites[i][1];
13+
edges[b].Add(a);
14+
++indegree[a];
1815
}
19-
20-
var queue = new Queue<int>();
21-
for (var i = 0; i < numCourses; ++i)
16+
var q = new Queue<int>();
17+
for (int i = 0; i < numCourses; ++i)
2218
{
23-
if (indegree[i] == 0) queue.Enqueue(i);
19+
if (indegree[i] == 0) q.Enqueue(i);
2420
}
25-
26-
var result = new int[numCourses];
27-
var count = 0;
28-
while (queue.Count > 0)
21+
var ans = new int[numCourses];
22+
var n = 0;
23+
while (q.Count > 0)
2924
{
30-
var node = queue.Dequeue();
31-
result[count++] = node;
32-
if (edge[node] != null)
25+
int b = q.Dequeue();
26+
ans[n++] = b;
27+
foreach (int a in edges[b])
3328
{
34-
foreach (var next in edge[node])
35-
{
36-
if (--indegree[next] == 0)
37-
{
38-
queue.Enqueue(next);
39-
}
40-
}
29+
if (--indegree[a] == 0) q.Enqueue(a);
4130
}
4231
}
43-
return count == numCourses ? result : new int[0];
32+
return n == numCourses ? ans : new int[0];
4433
}
4534
}

0 commit comments

Comments
 (0)