Skip to content

Commit 0744ae8

Browse files
committed
feat: add solutions to lc/lcof2 problem: Sequence Reconstruction
lc No.0444.Sequence Reconstruction lcof2 No.115.Sequence Reconstruction
1 parent b3e1475 commit 0744ae8

File tree

17 files changed

+1260
-6
lines changed

17 files changed

+1260
-6
lines changed

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

Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,198 @@
5454

5555
<p><meta charset="UTF-8" />注意:本题与主站 210&nbsp;题相同:<a href="https://leetcode-cn.com/problems/course-schedule-ii/">https://leetcode-cn.com/problems/course-schedule-ii/</a></p>
5656

57-
5857
## 解法
5958

6059
<!-- 这里可写通用的实现逻辑 -->
6160

61+
拓扑排序,BFS 实现。
62+
6263
<!-- tabs:start -->
6364

6465
### **Python3**
6566

6667
<!-- 这里可写当前语言的特殊实现逻辑 -->
6768

6869
```python
69-
70+
class Solution:
71+
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
72+
edges = collections.defaultdict(list)
73+
indegree = [0] * numCourses
74+
for i, j in prerequisites:
75+
edges[j].append(i)
76+
indegree[i] += 1
77+
q = collections.deque()
78+
for i in range(numCourses):
79+
if indegree[i] == 0:
80+
q.append(i)
81+
res = []
82+
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 []
7090
```
7191

7292
### **Java**
7393

7494
<!-- 这里可写当前语言的特殊实现逻辑 -->
7595

7696
```java
97+
class Solution {
98+
public int[] findOrder(int numCourses, int[][] prerequisites) {
99+
List<Integer>[] edges = new List[numCourses];
100+
for (int i = 0; i < numCourses; ++i) {
101+
edges[i] = new ArrayList<>();
102+
}
103+
int[] indegree = new int[numCourses];
104+
for (int[] p : prerequisites) {
105+
edges[p[1]].add(p[0]);
106+
++indegree[p[0]];
107+
}
108+
Queue<Integer> q = new LinkedList<>();
109+
for (int i = 0; i < numCourses; ++i) {
110+
if (indegree[i] == 0) {
111+
q.offer(i);
112+
}
113+
}
114+
int[] res = new int[numCourses];
115+
int cnt = 0;
116+
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);
123+
}
124+
}
125+
}
126+
return cnt == numCourses ? res : new int[0];
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
class Solution {
135+
public:
136+
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
137+
vector<vector<int>> edges(numCourses);
138+
vector<int> indegree(numCourses);
139+
for (auto p : prerequisites)
140+
{
141+
edges[p[1]].push_back(p[0]);
142+
++indegree[p[0]];
143+
}
144+
queue<int> q;
145+
for (int i = 0; i < numCourses; ++i)
146+
{
147+
if (indegree[i] == 0) q.push(i);
148+
}
149+
vector<int> res;
150+
while (!q.empty())
151+
{
152+
int i = q.front();
153+
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+
}
160+
}
161+
return res.size() == numCourses ? res : vector<int>();
162+
}
163+
};
164+
```
165+
166+
### **Go**
167+
168+
```go
169+
func findOrder(numCourses int, prerequisites [][]int) []int {
170+
edges := make([][]int, numCourses)
171+
indegree := make([]int, numCourses)
172+
for _, p := range prerequisites {
173+
edges[p[1]] = append(edges[p[1]], p[0])
174+
indegree[p[0]]++
175+
}
176+
var q []int
177+
for i := 0; i < numCourses; i++ {
178+
if indegree[i] == 0 {
179+
q = append(q, i)
180+
}
181+
}
182+
var res []int
183+
for len(q) > 0 {
184+
i := q[0]
185+
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)
191+
}
192+
}
193+
}
194+
if len(res) == numCourses {
195+
return res
196+
}
197+
return []int{}
198+
}
199+
```
77200

201+
### **C#**
202+
203+
```cs
204+
using System.Collections.Generic;
205+
206+
public class Solution {
207+
public int[] FindOrder(int numCourses, int[][] prerequisites) {
208+
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)
212+
{
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];
221+
}
222+
223+
var queue = new Queue<int>();
224+
for (var i = 0; i < numCourses; ++i)
225+
{
226+
if (indegree[i] == 0) queue.Enqueue(i);
227+
}
228+
229+
var result = new int[numCourses];
230+
var count = 0;
231+
while (queue.Count > 0)
232+
{
233+
var node = queue.Dequeue();
234+
result[count++] = node;
235+
if (edge[node] != null)
236+
{
237+
foreach (var next in edge[node])
238+
{
239+
if (--indegree[next] == 0)
240+
{
241+
queue.Enqueue(next);
242+
}
243+
}
244+
}
245+
}
246+
return count == numCourses ? result : new int[0];
247+
}
248+
}
78249
```
79250

80251
### **...**
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public:
3+
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
4+
vector<vector<int>> edges(numCourses);
5+
vector<int> indegree(numCourses);
6+
for (auto p : prerequisites)
7+
{
8+
edges[p[1]].push_back(p[0]);
9+
++indegree[p[0]];
10+
}
11+
queue<int> q;
12+
for (int i = 0; i < numCourses; ++i)
13+
{
14+
if (indegree[i] == 0) q.push(i);
15+
}
16+
vector<int> res;
17+
while (!q.empty())
18+
{
19+
int i = q.front();
20+
q.pop();
21+
res.push_back(i);
22+
for (int j : edges[i])
23+
{
24+
--indegree[j];
25+
if (indegree[j] == 0) q.push(j);
26+
}
27+
}
28+
return res.size() == numCourses ? res : vector<int>();
29+
}
30+
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Collections.Generic;
2+
3+
public class Solution {
4+
public int[] FindOrder(int numCourses, int[][] prerequisites) {
5+
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+
{
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];
18+
}
19+
20+
var queue = new Queue<int>();
21+
for (var i = 0; i < numCourses; ++i)
22+
{
23+
if (indegree[i] == 0) queue.Enqueue(i);
24+
}
25+
26+
var result = new int[numCourses];
27+
var count = 0;
28+
while (queue.Count > 0)
29+
{
30+
var node = queue.Dequeue();
31+
result[count++] = node;
32+
if (edge[node] != null)
33+
{
34+
foreach (var next in edge[node])
35+
{
36+
if (--indegree[next] == 0)
37+
{
38+
queue.Enqueue(next);
39+
}
40+
}
41+
}
42+
}
43+
return count == numCourses ? result : new int[0];
44+
}
45+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func findOrder(numCourses int, prerequisites [][]int) []int {
2+
edges := make([][]int, numCourses)
3+
indegree := make([]int, numCourses)
4+
for _, p := range prerequisites {
5+
edges[p[1]] = append(edges[p[1]], p[0])
6+
indegree[p[0]]++
7+
}
8+
var q []int
9+
for i := 0; i < numCourses; i++ {
10+
if indegree[i] == 0 {
11+
q = append(q, i)
12+
}
13+
}
14+
var res []int
15+
for len(q) > 0 {
16+
i := q[0]
17+
q = q[1:]
18+
res = append(res, i)
19+
for _, j := range edges[i] {
20+
indegree[j]--
21+
if indegree[j] == 0 {
22+
q = append(q, j)
23+
}
24+
}
25+
}
26+
if len(res) == numCourses {
27+
return res
28+
}
29+
return []int{}
30+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public int[] findOrder(int numCourses, int[][] prerequisites) {
3+
List<Integer>[] edges = new List[numCourses];
4+
for (int i = 0; i < numCourses; ++i) {
5+
edges[i] = new ArrayList<>();
6+
}
7+
int[] indegree = new int[numCourses];
8+
for (int[] p : prerequisites) {
9+
edges[p[1]].add(p[0]);
10+
++indegree[p[0]];
11+
}
12+
Queue<Integer> q = new LinkedList<>();
13+
for (int i = 0; i < numCourses; ++i) {
14+
if (indegree[i] == 0) {
15+
q.offer(i);
16+
}
17+
}
18+
int[] res = new int[numCourses];
19+
int cnt = 0;
20+
while (!q.isEmpty()) {
21+
int i = q.poll();
22+
res[cnt++] = i;
23+
for (int j : edges[i]) {
24+
--indegree[j];
25+
if (indegree[j] == 0) {
26+
q.offer(j);
27+
}
28+
}
29+
}
30+
return cnt == numCourses ? res : new int[0];
31+
}
32+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution:
2+
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
3+
edges = collections.defaultdict(list)
4+
indegree = [0] * numCourses
5+
for i, j in prerequisites:
6+
edges[j].append(i)
7+
indegree[i] += 1
8+
q = collections.deque()
9+
for i in range(numCourses):
10+
if indegree[i] == 0:
11+
q.append(i)
12+
res = []
13+
while q:
14+
i = q.popleft()
15+
res.append(i)
16+
for j in edges[i]:
17+
indegree[j] -= 1
18+
if indegree[j] == 0:
19+
q.append(j)
20+
return res if len(res) == numCourses else []

0 commit comments

Comments
 (0)