Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 101 additions & 80 deletions
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-
varnode = queue.Dequeue();
234-
result[count++] = node;
235-
if (edge[node] !=null)
260+
intb = q.Dequeue();
261+
ans[n++] = b;
262+
foreach (intainedges[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‎

Lines changed: 13 additions & 13 deletions
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
};
Lines changed: 21 additions & 32 deletions
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-
varnode = queue.Dequeue();
31-
result[count++] = node;
32-
if(edge[node]!=null)
25+
intb = q.Dequeue();
26+
ans[n++] = b;
27+
foreach(intainedges[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)

AltStyle によって変換されたページ (->オリジナル) /