Skip to content

Commit 9405562

Browse files
committedJul 23, 2022
feat: update solutions to lc/lcof2 problems: Sequence Reconstruction
* lc No.0444 & lcof2 No.115.Sequence Reconstruction
1 parent cc48369 commit 9405562

File tree

11 files changed

+348
-670
lines changed

11 files changed

+348
-670
lines changed
 

‎lcof2/剑指 Offer II 115. 重建序列/README.md

+101-153
Original file line numberDiff line numberDiff line change
@@ -4,63 +4,79 @@
44

55
<!-- 这里写题目描述 -->
66

7-
<p>请判断原始的序列&nbsp;<code>org</code>&nbsp;是否可以从序列集&nbsp;<code>seqs</code>&nbsp;中唯一地 <strong>重建&nbsp;</strong>。</p>
7+
<p>给定一个长度为 <code>n</code> 的整数数组 <code>nums</code> ,其中 <code>nums</code> 是范围为 <code>[1,n]</code> 的整数的排列。还提供了一个 2D 整数数组&nbsp;<code>sequences</code>&nbsp;,其中&nbsp;<code>sequences[i]</code>&nbsp;&nbsp;<code>nums</code>&nbsp;的子序列。<br />
8+
检查 <code>nums</code> 是否是唯一的最短&nbsp;<strong>超序列</strong> 。最短 <strong>超序列</strong> 是 <strong>长度最短</strong> 的序列,并且所有序列&nbsp;<code>sequences[i]</code>&nbsp;都是它的子序列。对于给定的数组&nbsp;<code>sequences</code>&nbsp;,可能存在多个有效的 <strong>超序列</strong> 。</p>
89

9-
<p>序列&nbsp;<code>org</code>&nbsp;是 1 到 n 整数的排列,其中 1 &le; n &le; 10<sup>4</sup>。<strong>重建&nbsp;</strong>是指在序列集 <code>seqs</code> 中构建最短的公共超序列,即&nbsp;&nbsp;<code>seqs</code>&nbsp;中的任意序列都是该最短序列的子序列。</p>
10+
<ul>
11+
<li>例如,对于&nbsp;<code>sequences = [[1,2],[1,3]]</code>&nbsp;,有两个最短的 <strong>超序列</strong> ,<code>[1,2,3]</code> 和 <code>[1,3,2]</code> 。</li>
12+
<li>而对于&nbsp;<code>sequences = [[1,2],[1,3],[1,2,3]]</code>&nbsp;,唯一可能的最短 <strong>超序列</strong> 是 <code>[1,2,3]</code> 。<code>[1,2,3,4]</code> 是可能的超序列,但不是最短的。</li>
13+
</ul>
14+
15+
<p><em>如果 <code>nums</code> 是序列的唯一最短 <strong>超序列</strong> ,则返回 <code>true</code> ,否则返回 <code>false</code> 。</em><br />
16+
<strong>子序列</strong> 是一个可以通过从另一个序列中删除一些元素或不删除任何元素,而不改变其余元素的顺序的序列。</p>
1017

1118
<p>&nbsp;</p>
1219

1320
<p><strong>示例 1:</strong></p>
1421

1522
<pre>
16-
<strong>输入: </strong>org = [1,2,3], seqs = [[1,2],[1,3]]
17-
<strong>输出: </strong>false
18-
<strong>解释:</strong>[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。
23+
<strong>输入:</strong>nums = [1,2,3], sequences = [[1,2],[1,3]]
24+
<strong>输出:</strong>false
25+
<strong>解释:</strong>有两种可能的超序列:[1,2,3]和[1,3,2]。
26+
序列 [1,2] 是[<u><strong>1,2</strong></u>,3]和[<u><strong>1</strong></u>,3,<u><strong>2</strong></u>]的子序列。
27+
序列 [1,3] 是[<u><strong>1</strong></u>,2,<u><strong>3</strong></u>]和[<u><strong>1,3</strong></u>,2]的子序列。
28+
因为 nums 不是唯一最短的超序列,所以返回false。
1929
</pre>
2030

2131
<p><strong>示例 2:</strong></p>
2232

2333
<pre>
24-
<strong>输入: </strong>org = [1,2,3], seqs = [[1,2]]
25-
<strong>输出: </strong>false
26-
<strong>解释:</strong>可以重建的序列只有 [1,2]。
34+
<strong>输入:</strong>nums = [1,2,3], sequences = [[1,2]]
35+
<strong>输出:</strong>false
36+
<strong>解释:</strong>最短可能的超序列为 [1,2]。
37+
序列 [1,2] 是它的子序列:[<u><strong>1,2</strong></u>]。
38+
因为 nums 不是最短的超序列,所以返回false。
2739
</pre>
2840

2941
<p><strong>示例 3:</strong></p>
3042

3143
<pre>
32-
<strong>输入: </strong>org = [1,2,3], seqs = [[1,2],[1,3],[2,3]]
33-
<strong>输出: </strong>true
34-
<strong>解释:</strong>序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建为原始的序列 [1,2,3]。
35-
</pre>
36-
37-
<p><strong>示例 4:</strong></p>
38-
39-
<pre>
40-
<strong>输入: </strong>org = [4,1,5,2,6,3], seqs = [[5,2,6,3],[4,1,5,2]]
41-
<strong>输出: </strong>true
42-
</pre>
44+
<strong>输入:</strong>nums = [1,2,3], sequences = [[1,2],[1,3],[2,3]]
45+
<strong>输出:</strong>true
46+
<strong>解释:</strong>最短可能的超序列为[1,2,3]。
47+
序列 [1,2] 是它的一个子序列:[<strong>1,2</strong>,3]。
48+
序列 [1,3] 是它的一个子序列:[<u><strong>1</strong></u>,2,<u><strong>3</strong></u>]。
49+
序列 [2,3] 是它的一个子序列:[1,<u><strong>2,3</strong></u>]。
50+
因为 nums 是唯一最短的超序列,所以返回true。</pre>
4351

4452
<p>&nbsp;</p>
4553

4654
<p><strong>提示:</strong></p>
4755

4856
<ul>
57+
<li><code>n == nums.length</code></li>
4958
<li><code>1 &lt;= n &lt;= 10<sup>4</sup></code></li>
50-
<li><code>org</code> 是数字 <code>1</code> 到 <code>n</code> 的一个排列</li>
51-
<li><code>1 &lt;= segs[i].length &lt;= 10<sup>5</sup></code></li>
52-
<li><code>seqs[i][j]</code> 是 <code>32</code> 位有符号整数</li>
59+
<li><code>nums</code>&nbsp;是&nbsp;<code>[1, n]</code>&nbsp;范围内所有整数的排列</li>
60+
<li><code>1 &lt;= sequences.length &lt;= 10<sup>4</sup></code></li>
61+
<li><code>1 &lt;= sequences[i].length &lt;= 10<sup>4</sup></code></li>
62+
<li><code>1 &lt;= sum(sequences[i].length) &lt;= 10<sup>5</sup></code></li>
63+
<li><code>1 &lt;= sequences[i][j] &lt;= n</code></li>
64+
<li><code>sequences</code>&nbsp;的所有数组都是 <strong>唯一 </strong>的</li>
65+
<li><code>sequences[i]</code>&nbsp;是&nbsp;<code>nums</code> 的一个子序列</li>
5366
</ul>
5467

5568
<p>&nbsp;</p>
5669

57-
<p>注意:本题与主站 444&nbsp;题相同:<a href="https://leetcode.cn/problems/sequence-reconstruction/">https://leetcode.cn/problems/sequence-reconstruction/</a></p>
70+
<p>注意:本题与主站 444&nbsp;题相同:<a href="https://leetcode.cn/problems/sequence-reconstruction/">https://leetcode-cn.com/problems/sequence-reconstruction/</a></p>
71+
5872

5973
## 解法
6074

6175
<!-- 这里可写通用的实现逻辑 -->
6276

63-
拓扑排序,BFS 实现。
77+
**方法一:拓扑排序**
78+
79+
BFS 实现。
6480

6581
<!-- tabs:start -->
6682

@@ -70,40 +86,23 @@
7086

7187
```python
7288
class Solution:
73-
def sequenceReconstruction(self, org: List[int], seqs: List[List[int]]) -> bool:
74-
n = len(org)
75-
nums = set()
76-
for seq in seqs:
77-
for num in seq:
78-
if num < 1 or num > n:
79-
return False
80-
nums.add(num)
81-
if len(nums) < n:
82-
return False
83-
84-
edges = defaultdict(list)
85-
indegree = [0] * (n + 1)
86-
for seq in seqs:
87-
i = seq[0]
88-
for j in seq[1:]:
89-
edges[i].append(j)
90-
indegree[j] += 1
91-
i = j
92-
q = deque()
93-
for i in range(1, n + 1):
94-
if indegree[i] == 0:
95-
q.append(i)
96-
cnt = 0
89+
def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
90+
g = defaultdict(list)
91+
indeg = [0] * len(nums)
92+
for seq in sequences:
93+
for a, b in pairwise(seq):
94+
g[a - 1].append(b - 1)
95+
indeg[b - 1] += 1
96+
q = deque([i for i, v in enumerate(indeg) if v == 0])
9797
while q:
98-
if len(q) > 1 or org[cnt] != q[0]:
98+
if len(q) > 1:
9999
return False
100100
i = q.popleft()
101-
cnt += 1
102-
for j in edges[i]:
103-
indegree[j] -= 1
104-
if indegree[j] == 0:
101+
for j in g[i]:
102+
indeg[j] -= 1
103+
if indeg[j] == 0:
105104
q.append(j)
106-
return cnt == n
105+
return True
107106
```
108107

109108
### **Java**
@@ -112,54 +111,38 @@ class Solution:
112111

113112
```java
114113
class Solution {
115-
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
116-
int n = org.length;
117-
Set<Integer> nums = new HashSet<>();
118-
for (List<Integer> seq : seqs) {
119-
for (int num : seq) {
120-
if (num < 1 || num > n) {
121-
return false;
122-
}
123-
nums.add(num);
124-
}
125-
}
126-
if (nums.size() < n) {
127-
return false;
114+
public boolean sequenceReconstruction(int[] nums, int[][] sequences) {
115+
int n = nums.length;
116+
int[] indeg = new int[n];
117+
List<Integer>[] g = new List[n];
118+
for (int i = 0; i < n; ++i) {
119+
g[i] = new ArrayList<>();
128120
}
129-
List<Integer>[] edges = new List[n + 1];
130-
for (int i = 0; i < edges.length; ++i) {
131-
edges[i] = new ArrayList<>();
132-
}
133-
int[] indegree = new int[n + 1];
134-
for (List<Integer> seq : seqs) {
135-
int i = seq.get(0);
136-
for (int j = 1; j < seq.size(); ++j) {
137-
edges[i].add(seq.get(j));
138-
++indegree[seq.get(j)];
139-
i = seq.get(j);
121+
for (int[] seq : sequences) {
122+
for (int i = 1; i < seq.length; ++i) {
123+
int a = seq[i - 1] - 1, b = seq[i] - 1;
124+
g[a].add(b);
125+
indeg[b]++;
140126
}
141127
}
142-
Queue<Integer> q = new LinkedList<>();
143-
for (int i = 1; i <= n; ++i) {
144-
if (indegree[i] == 0) {
128+
Deque<Integer> q = new ArrayDeque<>();
129+
for (int i = 0; i < n; ++i) {
130+
if (indeg[i] == 0) {
145131
q.offer(i);
146132
}
147133
}
148-
int cnt = 0;
149134
while (!q.isEmpty()) {
150-
if (q.size() > 1 || q.peek() != org[cnt]) {
135+
if (q.size() > 1) {
151136
return false;
152137
}
153-
++cnt;
154138
int i = q.poll();
155-
for (int j : edges[i]) {
156-
--indegree[j];
157-
if (indegree[j] == 0) {
139+
for (int j : g[i]) {
140+
if (--indeg[j] == 0) {
158141
q.offer(j);
159142
}
160143
}
161144
}
162-
return cnt == n;
145+
return true;
163146
}
164147
}
165148
```
@@ -169,102 +152,67 @@ class Solution {
169152
```cpp
170153
class Solution {
171154
public:
172-
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
173-
int n = org.size();
174-
unordered_set<int> nums;
175-
for (auto& seq : seqs)
155+
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
156+
int n = nums.size();
157+
vector<vector<int>> g(n);
158+
vector<int> indeg(n);
159+
for (auto& seq : sequences)
176160
{
177-
for (int num : seq)
161+
for (int i = 1; i < seq.size(); ++i)
178162
{
179-
if (num < 1 || num > n) return false;
180-
nums.insert(num);
181-
}
182-
}
183-
if (nums.size() < n) return false;
184-
vector<vector<int>> edges(n + 1);
185-
vector<int> indegree(n + 1);
186-
for (auto& seq : seqs)
187-
{
188-
int i = seq[0];
189-
for (int j = 1; j < seq.size(); ++j)
190-
{
191-
edges[i].push_back(seq[j]);
192-
++indegree[seq[j]];
193-
i = seq[j];
163+
int a = seq[i - 1] - 1, b = seq[i] - 1;
164+
g[a].push_back(b);
165+
++indeg[b];
194166
}
195167
}
196168
queue<int> q;
197-
for (int i = 1; i <= n; ++i)
198-
{
199-
if (indegree[i] == 0) q.push(i);
200-
}
201-
int cnt = 0;
169+
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
202170
while (!q.empty())
203171
{
204-
if (q.size() > 1 || q.front() != org[cnt]) return false;
205-
++cnt;
172+
if (q.size() > 1) return false;
206173
int i = q.front();
207174
q.pop();
208-
for (int j : edges[i])
209-
{
210-
--indegree[j];
211-
if (indegree[j] == 0) q.push(j);
212-
}
175+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
213176
}
214-
return cnt == n;
177+
return true;
215178
}
216179
};
217180
```
218181
219182
### **Go**
220183
221184
```go
222-
func sequenceReconstruction(org []int, seqs [][]int) bool {
223-
n := len(org)
224-
nums := make(map[int]bool)
225-
for _, seq := range seqs {
226-
for _, num := range seq {
227-
if num < 1 || num > n {
228-
return false
229-
}
230-
nums[num] = true
231-
}
232-
}
233-
if len(nums) < n {
234-
return false
235-
}
236-
edges := make([][]int, n+1)
237-
indegree := make([]int, n+1)
238-
for _, seq := range seqs {
239-
i := seq[0]
240-
for _, j := range seq[1:] {
241-
edges[i] = append(edges[i], j)
242-
indegree[j]++
243-
i = j
185+
func sequenceReconstruction(nums []int, sequences [][]int) bool {
186+
n := len(nums)
187+
g := make([][]int, n)
188+
indeg := make([]int, n)
189+
for _, seq := range sequences {
190+
for i := 1; i < len(seq); i++ {
191+
a, b := seq[i-1]-1, seq[i]-1
192+
g[a] = append(g[a], b)
193+
indeg[b]++
244194
}
245195
}
246-
var q []int
247-
for i := 1; i <= n; i++ {
248-
if indegree[i] == 0 {
196+
q := []int{}
197+
for i, v := range indeg {
198+
if v == 0 {
249199
q = append(q, i)
250200
}
251201
}
252-
cnt := 0
253202
for len(q) > 0 {
254-
if len(q) > 1 || org[cnt] != q[0] {
203+
if len(q) > 1 {
255204
return false
256205
}
257206
i := q[0]
258207
q = q[1:]
259-
cnt++
260-
for _, j := range edges[i] {
261-
indegree[j]--
262-
if indegree[j] == 0 {
208+
for _, j := range g[i] {
209+
indeg[j]--
210+
if indeg[j] == 0 {
263211
q = append(q, j)
264212
}
265213
}
266214
}
267-
return cnt == n
215+
return true
268216
}
269217
```
270218

Original file line numberDiff line numberDiff line change
@@ -1,47 +1,27 @@
11
class Solution {
22
public:
3-
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
4-
int n = org.size();
5-
unordered_set<int> nums;
6-
for (auto& seq : seqs)
3+
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
4+
int n = nums.size();
5+
vector<vector<int>> g(n);
6+
vector<int> indeg(n);
7+
for (auto& seq : sequences)
78
{
8-
for (int num : seq)
9+
for (int i = 1; i < seq.size(); ++i)
910
{
10-
if (num < 1 || num > n) return false;
11-
nums.insert(num);
12-
}
13-
}
14-
if (nums.size() < n) return false;
15-
vector<vector<int>> edges(n + 1);
16-
vector<int> indegree(n + 1);
17-
for (auto& seq : seqs)
18-
{
19-
int i = seq[0];
20-
for (int j = 1; j < seq.size(); ++j)
21-
{
22-
edges[i].push_back(seq[j]);
23-
++indegree[seq[j]];
24-
i = seq[j];
11+
int a = seq[i - 1] - 1, b = seq[i] - 1;
12+
g[a].push_back(b);
13+
++indeg[b];
2514
}
2615
}
2716
queue<int> q;
28-
for (int i = 1; i <= n; ++i)
29-
{
30-
if (indegree[i] == 0) q.push(i);
31-
}
32-
int cnt = 0;
17+
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
3318
while (!q.empty())
3419
{
35-
if (q.size() > 1 || q.front() != org[cnt]) return false;
36-
++cnt;
20+
if (q.size() > 1) return false;
3721
int i = q.front();
3822
q.pop();
39-
for (int j : edges[i])
40-
{
41-
--indegree[j];
42-
if (indegree[j] == 0) q.push(j);
43-
}
23+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
4424
}
45-
return cnt == n;
25+
return true;
4626
}
4727
};
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,32 @@
1-
func sequenceReconstruction(org []int, seqs [][]int) bool {
2-
n := len(org)
3-
nums := make(map[int]bool)
4-
for _, seq := range seqs {
5-
for _, num := range seq {
6-
if num < 1 || num > n {
7-
return false
8-
}
9-
nums[num] = true
10-
}
11-
}
12-
if len(nums) < n {
13-
return false
14-
}
15-
edges := make([][]int, n+1)
16-
indegree := make([]int, n+1)
17-
for _, seq := range seqs {
18-
i := seq[0]
19-
for _, j := range seq[1:] {
20-
edges[i] = append(edges[i], j)
21-
indegree[j]++
22-
i = j
1+
func sequenceReconstruction(nums []int, sequences [][]int) bool {
2+
n := len(nums)
3+
g := make([][]int, n)
4+
indeg := make([]int, n)
5+
for _, seq := range sequences {
6+
for i := 1; i < len(seq); i++ {
7+
a, b := seq[i-1]-1, seq[i]-1
8+
g[a] = append(g[a], b)
9+
indeg[b]++
2310
}
2411
}
25-
var q []int
26-
for i := 1; i <= n; i++ {
27-
if indegree[i] == 0 {
12+
q := []int{}
13+
for i, v := range indeg {
14+
if v == 0 {
2815
q = append(q, i)
2916
}
3017
}
31-
cnt := 0
3218
for len(q) > 0 {
33-
if len(q) > 1 || org[cnt] != q[0] {
19+
if len(q) > 1 {
3420
return false
3521
}
3622
i := q[0]
3723
q = q[1:]
38-
cnt++
39-
for _, j := range edges[i] {
40-
indegree[j]--
41-
if indegree[j] == 0 {
24+
for _, j := range g[i] {
25+
indeg[j]--
26+
if indeg[j] == 0 {
4227
q = append(q, j)
4328
}
4429
}
4530
}
46-
return cnt == n
31+
return true
4732
}
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,35 @@
11
class Solution {
2-
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
3-
int n = org.length;
4-
Set<Integer> nums = new HashSet<>();
5-
for (List<Integer> seq : seqs) {
6-
for (int num : seq) {
7-
if (num < 1 || num > n) {
8-
return false;
9-
}
10-
nums.add(num);
11-
}
12-
}
13-
if (nums.size() < n) {
14-
return false;
15-
}
16-
List<Integer>[] edges = new List[n + 1];
17-
for (int i = 0; i < edges.length; ++i) {
18-
edges[i] = new ArrayList<>();
2+
public boolean sequenceReconstruction(int[] nums, int[][] sequences) {
3+
int n = nums.length;
4+
int[] indeg = new int[n];
5+
List<Integer>[] g = new List[n];
6+
for (int i = 0; i < n; ++i) {
7+
g[i] = new ArrayList<>();
198
}
20-
int[] indegree = new int[n + 1];
21-
for (List<Integer> seq : seqs) {
22-
int i = seq.get(0);
23-
for (int j = 1; j < seq.size(); ++j) {
24-
edges[i].add(seq.get(j));
25-
++indegree[seq.get(j)];
26-
i = seq.get(j);
9+
for (int[] seq : sequences) {
10+
for (int i = 1; i < seq.length; ++i) {
11+
int a = seq[i - 1] - 1, b = seq[i] - 1;
12+
g[a].add(b);
13+
indeg[b]++;
2714
}
2815
}
29-
Queue<Integer> q = new LinkedList<>();
30-
for (int i = 1; i <= n; ++i) {
31-
if (indegree[i] == 0) {
16+
Deque<Integer> q = new ArrayDeque<>();
17+
for (int i = 0; i < n; ++i) {
18+
if (indeg[i] == 0) {
3219
q.offer(i);
3320
}
3421
}
35-
int cnt = 0;
3622
while (!q.isEmpty()) {
37-
if (q.size() > 1 || q.peek() != org[cnt]) {
23+
if (q.size() > 1) {
3824
return false;
3925
}
40-
++cnt;
4126
int i = q.poll();
42-
for (int j : edges[i]) {
43-
--indegree[j];
44-
if (indegree[j] == 0) {
27+
for (int j : g[i]) {
28+
if (--indeg[j] == 0) {
4529
q.offer(j);
4630
}
4731
}
4832
}
49-
return cnt == n;
33+
return true;
5034
}
5135
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
11
class Solution:
2-
def sequenceReconstruction(self, org: List[int], seqs: List[List[int]]) -> bool:
3-
n = len(org)
4-
nums = set()
5-
for seq in seqs:
6-
for num in seq:
7-
if num < 1 or num > n:
8-
return False
9-
nums.add(num)
10-
if len(nums) < n:
11-
return False
12-
13-
edges = defaultdict(list)
14-
indegree = [0] * (n + 1)
15-
for seq in seqs:
16-
i = seq[0]
17-
for j in seq[1:]:
18-
edges[i].append(j)
19-
indegree[j] += 1
20-
i = j
21-
q = deque()
22-
for i in range(1, n + 1):
23-
if indegree[i] == 0:
24-
q.append(i)
25-
cnt = 0
2+
def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
3+
g = defaultdict(list)
4+
indeg = [0] * len(nums)
5+
for seq in sequences:
6+
for a, b in pairwise(seq):
7+
g[a - 1].append(b - 1)
8+
indeg[b - 1] += 1
9+
q = deque([i for i, v in enumerate(indeg) if v == 0])
2610
while q:
27-
if len(q) > 1 or org[cnt] != q[0]:
11+
if len(q) > 1:
2812
return False
2913
i = q.popleft()
30-
cnt += 1
31-
for j in edges[i]:
32-
indegree[j] -= 1
33-
if indegree[j] == 0:
14+
for j in g[i]:
15+
indeg[j] -= 1
16+
if indeg[j] == 0:
3417
q.append(j)
35-
return cnt == n
18+
return True

‎solution/0400-0499/0444.Sequence Reconstruction/README.md

+64-130
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@
7171

7272
<!-- 这里可写通用的实现逻辑 -->
7373

74-
拓扑排序,BFS 实现。
74+
**方法一:拓扑排序**
75+
76+
BFS 实现。
7577

7678
<!-- tabs:start -->
7779

@@ -81,40 +83,23 @@
8183

8284
```python
8385
class Solution:
84-
def sequenceReconstruction(self, org: List[int], seqs: List[List[int]]) -> bool:
85-
n = len(org)
86-
nums = set()
87-
for seq in seqs:
88-
for num in seq:
89-
if num < 1 or num > n:
90-
return False
91-
nums.add(num)
92-
if len(nums) < n:
93-
return False
94-
95-
edges = defaultdict(list)
96-
indegree = [0] * (n + 1)
97-
for seq in seqs:
98-
i = seq[0]
99-
for j in seq[1:]:
100-
edges[i].append(j)
101-
indegree[j] += 1
102-
i = j
103-
q = deque()
104-
for i in range(1, n + 1):
105-
if indegree[i] == 0:
106-
q.append(i)
107-
cnt = 0
86+
def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
87+
g = defaultdict(list)
88+
indeg = [0] * len(nums)
89+
for seq in sequences:
90+
for a, b in pairwise(seq):
91+
g[a - 1].append(b - 1)
92+
indeg[b - 1] += 1
93+
q = deque([i for i, v in enumerate(indeg) if v == 0])
10894
while q:
109-
if len(q) > 1 or org[cnt] != q[0]:
95+
if len(q) > 1:
11096
return False
11197
i = q.popleft()
112-
cnt += 1
113-
for j in edges[i]:
114-
indegree[j] -= 1
115-
if indegree[j] == 0:
98+
for j in g[i]:
99+
indeg[j] -= 1
100+
if indeg[j] == 0:
116101
q.append(j)
117-
return cnt == n
102+
return True
118103
```
119104

120105
### **Java**
@@ -123,54 +108,38 @@ class Solution:
123108

124109
```java
125110
class Solution {
126-
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
127-
int n = org.length;
128-
Set<Integer> nums = new HashSet<>();
129-
for (List<Integer> seq : seqs) {
130-
for (int num : seq) {
131-
if (num < 1 || num > n) {
132-
return false;
133-
}
134-
nums.add(num);
135-
}
136-
}
137-
if (nums.size() < n) {
138-
return false;
139-
}
140-
List<Integer>[] edges = new List[n + 1];
141-
for (int i = 0; i < edges.length; ++i) {
142-
edges[i] = new ArrayList<>();
111+
public boolean sequenceReconstruction(int[] nums, List<List<Integer>> sequences) {
112+
int n = nums.length;
113+
int[] indeg = new int[n];
114+
List<Integer>[] g = new List[n];
115+
for (int i = 0; i < n; ++i) {
116+
g[i] = new ArrayList<>();
143117
}
144-
int[] indegree = new int[n + 1];
145-
for (List<Integer> seq : seqs) {
146-
int i = seq.get(0);
147-
for (int j = 1; j < seq.size(); ++j) {
148-
edges[i].add(seq.get(j));
149-
++indegree[seq.get(j)];
150-
i = seq.get(j);
118+
for (var seq : sequences) {
119+
for (int i = 1; i < seq.size(); ++i) {
120+
int a = seq.get(i - 1) - 1, b = seq.get(i) - 1;
121+
g[a].add(b);
122+
indeg[b]++;
151123
}
152124
}
153-
Queue<Integer> q = new LinkedList<>();
154-
for (int i = 1; i <= n; ++i) {
155-
if (indegree[i] == 0) {
125+
Deque<Integer> q = new ArrayDeque<>();
126+
for (int i = 0; i < n; ++i) {
127+
if (indeg[i] == 0) {
156128
q.offer(i);
157129
}
158130
}
159-
int cnt = 0;
160131
while (!q.isEmpty()) {
161-
if (q.size() > 1 || q.peek() != org[cnt]) {
132+
if (q.size() > 1) {
162133
return false;
163134
}
164-
++cnt;
165135
int i = q.poll();
166-
for (int j : edges[i]) {
167-
--indegree[j];
168-
if (indegree[j] == 0) {
136+
for (int j : g[i]) {
137+
if (--indeg[j] == 0) {
169138
q.offer(j);
170139
}
171140
}
172141
}
173-
return cnt == n;
142+
return true;
174143
}
175144
}
176145
```
@@ -180,102 +149,67 @@ class Solution {
180149
```cpp
181150
class Solution {
182151
public:
183-
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
184-
int n = org.size();
185-
unordered_set<int> nums;
186-
for (auto& seq : seqs)
187-
{
188-
for (int num : seq)
189-
{
190-
if (num < 1 || num > n) return false;
191-
nums.insert(num);
192-
}
193-
}
194-
if (nums.size() < n) return false;
195-
vector<vector<int>> edges(n + 1);
196-
vector<int> indegree(n + 1);
197-
for (auto& seq : seqs)
152+
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
153+
int n = nums.size();
154+
vector<vector<int>> g(n);
155+
vector<int> indeg(n);
156+
for (auto& seq : sequences)
198157
{
199-
int i = seq[0];
200-
for (int j = 1; j < seq.size(); ++j)
158+
for (int i = 1; i < seq.size(); ++i)
201159
{
202-
edges[i].push_back(seq[j]);
203-
++indegree[seq[j]];
204-
i = seq[j];
160+
int a = seq[i - 1] - 1, b = seq[i] - 1;
161+
g[a].push_back(b);
162+
++indeg[b];
205163
}
206164
}
207165
queue<int> q;
208-
for (int i = 1; i <= n; ++i)
209-
{
210-
if (indegree[i] == 0) q.push(i);
211-
}
212-
int cnt = 0;
166+
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
213167
while (!q.empty())
214168
{
215-
if (q.size() > 1 || q.front() != org[cnt]) return false;
216-
++cnt;
169+
if (q.size() > 1) return false;
217170
int i = q.front();
218171
q.pop();
219-
for (int j : edges[i])
220-
{
221-
--indegree[j];
222-
if (indegree[j] == 0) q.push(j);
223-
}
172+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
224173
}
225-
return cnt == n;
174+
return true;
226175
}
227176
};
228177
```
229178
230179
### **Go**
231180
232181
```go
233-
func sequenceReconstruction(org []int, seqs [][]int) bool {
234-
n := len(org)
235-
nums := make(map[int]bool)
236-
for _, seq := range seqs {
237-
for _, num := range seq {
238-
if num < 1 || num > n {
239-
return false
240-
}
241-
nums[num] = true
242-
}
243-
}
244-
if len(nums) < n {
245-
return false
246-
}
247-
edges := make([][]int, n+1)
248-
indegree := make([]int, n+1)
249-
for _, seq := range seqs {
250-
i := seq[0]
251-
for _, j := range seq[1:] {
252-
edges[i] = append(edges[i], j)
253-
indegree[j]++
254-
i = j
182+
func sequenceReconstruction(nums []int, sequences [][]int) bool {
183+
n := len(nums)
184+
g := make([][]int, n)
185+
indeg := make([]int, n)
186+
for _, seq := range sequences {
187+
for i := 1; i < len(seq); i++ {
188+
a, b := seq[i-1]-1, seq[i]-1
189+
g[a] = append(g[a], b)
190+
indeg[b]++
255191
}
256192
}
257-
var q []int
258-
for i := 1; i <= n; i++ {
259-
if indegree[i] == 0 {
193+
q := []int{}
194+
for i, v := range indeg {
195+
if v == 0 {
260196
q = append(q, i)
261197
}
262198
}
263-
cnt := 0
264199
for len(q) > 0 {
265-
if len(q) > 1 || org[cnt] != q[0] {
200+
if len(q) > 1 {
266201
return false
267202
}
268203
i := q[0]
269204
q = q[1:]
270-
cnt++
271-
for _, j := range edges[i] {
272-
indegree[j]--
273-
if indegree[j] == 0 {
205+
for _, j := range g[i] {
206+
indeg[j]--
207+
if indeg[j] == 0 {
274208
q = append(q, j)
275209
}
276210
}
277211
}
278-
return cnt == n
212+
return true
279213
}
280214
```
281215

‎solution/0400-0499/0444.Sequence Reconstruction/README_EN.md

+61-129
Original file line numberDiff line numberDiff line change
@@ -74,94 +74,61 @@ Since nums is the only shortest supersequence, we return true.
7474

7575
```python
7676
class Solution:
77-
def sequenceReconstruction(self, org: List[int], seqs: List[List[int]]) -> bool:
78-
n = len(org)
79-
nums = set()
80-
for seq in seqs:
81-
for num in seq:
82-
if num < 1 or num > n:
83-
return False
84-
nums.add(num)
85-
if len(nums) < n:
86-
return False
87-
88-
edges = defaultdict(list)
89-
indegree = [0] * (n + 1)
90-
for seq in seqs:
91-
i = seq[0]
92-
for j in seq[1:]:
93-
edges[i].append(j)
94-
indegree[j] += 1
95-
i = j
96-
q = deque()
97-
for i in range(1, n + 1):
98-
if indegree[i] == 0:
99-
q.append(i)
100-
cnt = 0
77+
def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
78+
g = defaultdict(list)
79+
indeg = [0] * len(nums)
80+
for seq in sequences:
81+
for a, b in pairwise(seq):
82+
g[a - 1].append(b - 1)
83+
indeg[b - 1] += 1
84+
q = deque([i for i, v in enumerate(indeg) if v == 0])
10185
while q:
102-
if len(q) > 1 or org[cnt] != q[0]:
86+
if len(q) > 1:
10387
return False
10488
i = q.popleft()
105-
cnt += 1
106-
for j in edges[i]:
107-
indegree[j] -= 1
108-
if indegree[j] == 0:
89+
for j in g[i]:
90+
indeg[j] -= 1
91+
if indeg[j] == 0:
10992
q.append(j)
110-
return cnt == n
93+
return True
11194
```
11295

11396
### **Java**
11497

11598
```java
11699
class Solution {
117-
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
118-
int n = org.length;
119-
Set<Integer> nums = new HashSet<>();
120-
for (List<Integer> seq : seqs) {
121-
for (int num : seq) {
122-
if (num < 1 || num > n) {
123-
return false;
124-
}
125-
nums.add(num);
126-
}
127-
}
128-
if (nums.size() < n) {
129-
return false;
130-
}
131-
List<Integer>[] edges = new List[n + 1];
132-
for (int i = 0; i < edges.length; ++i) {
133-
edges[i] = new ArrayList<>();
100+
public boolean sequenceReconstruction(int[] nums, List<List<Integer>> sequences) {
101+
int n = nums.length;
102+
int[] indeg = new int[n];
103+
List<Integer>[] g = new List[n];
104+
for (int i = 0; i < n; ++i) {
105+
g[i] = new ArrayList<>();
134106
}
135-
int[] indegree = new int[n + 1];
136-
for (List<Integer> seq : seqs) {
137-
int i = seq.get(0);
138-
for (int j = 1; j < seq.size(); ++j) {
139-
edges[i].add(seq.get(j));
140-
++indegree[seq.get(j)];
141-
i = seq.get(j);
107+
for (var seq : sequences) {
108+
for (int i = 1; i < seq.size(); ++i) {
109+
int a = seq.get(i - 1) - 1, b = seq.get(i) - 1;
110+
g[a].add(b);
111+
indeg[b]++;
142112
}
143113
}
144-
Queue<Integer> q = new LinkedList<>();
145-
for (int i = 1; i <= n; ++i) {
146-
if (indegree[i] == 0) {
114+
Deque<Integer> q = new ArrayDeque<>();
115+
for (int i = 0; i < n; ++i) {
116+
if (indeg[i] == 0) {
147117
q.offer(i);
148118
}
149119
}
150-
int cnt = 0;
151120
while (!q.isEmpty()) {
152-
if (q.size() > 1 || q.peek() != org[cnt]) {
121+
if (q.size() > 1) {
153122
return false;
154123
}
155-
++cnt;
156124
int i = q.poll();
157-
for (int j : edges[i]) {
158-
--indegree[j];
159-
if (indegree[j] == 0) {
125+
for (int j : g[i]) {
126+
if (--indeg[j] == 0) {
160127
q.offer(j);
161128
}
162129
}
163130
}
164-
return cnt == n;
131+
return true;
165132
}
166133
}
167134
```
@@ -171,102 +138,67 @@ class Solution {
171138
```cpp
172139
class Solution {
173140
public:
174-
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
175-
int n = org.size();
176-
unordered_set<int> nums;
177-
for (auto& seq : seqs)
178-
{
179-
for (int num : seq)
180-
{
181-
if (num < 1 || num > n) return false;
182-
nums.insert(num);
183-
}
184-
}
185-
if (nums.size() < n) return false;
186-
vector<vector<int>> edges(n + 1);
187-
vector<int> indegree(n + 1);
188-
for (auto& seq : seqs)
141+
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
142+
int n = nums.size();
143+
vector<vector<int>> g(n);
144+
vector<int> indeg(n);
145+
for (auto& seq : sequences)
189146
{
190-
int i = seq[0];
191-
for (int j = 1; j < seq.size(); ++j)
147+
for (int i = 1; i < seq.size(); ++i)
192148
{
193-
edges[i].push_back(seq[j]);
194-
++indegree[seq[j]];
195-
i = seq[j];
149+
int a = seq[i - 1] - 1, b = seq[i] - 1;
150+
g[a].push_back(b);
151+
++indeg[b];
196152
}
197153
}
198154
queue<int> q;
199-
for (int i = 1; i <= n; ++i)
200-
{
201-
if (indegree[i] == 0) q.push(i);
202-
}
203-
int cnt = 0;
155+
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
204156
while (!q.empty())
205157
{
206-
if (q.size() > 1 || q.front() != org[cnt]) return false;
207-
++cnt;
158+
if (q.size() > 1) return false;
208159
int i = q.front();
209160
q.pop();
210-
for (int j : edges[i])
211-
{
212-
--indegree[j];
213-
if (indegree[j] == 0) q.push(j);
214-
}
161+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
215162
}
216-
return cnt == n;
163+
return true;
217164
}
218165
};
219166
```
220167
221168
### **Go**
222169
223170
```go
224-
func sequenceReconstruction(org []int, seqs [][]int) bool {
225-
n := len(org)
226-
nums := make(map[int]bool)
227-
for _, seq := range seqs {
228-
for _, num := range seq {
229-
if num < 1 || num > n {
230-
return false
231-
}
232-
nums[num] = true
233-
}
234-
}
235-
if len(nums) < n {
236-
return false
237-
}
238-
edges := make([][]int, n+1)
239-
indegree := make([]int, n+1)
240-
for _, seq := range seqs {
241-
i := seq[0]
242-
for _, j := range seq[1:] {
243-
edges[i] = append(edges[i], j)
244-
indegree[j]++
245-
i = j
171+
func sequenceReconstruction(nums []int, sequences [][]int) bool {
172+
n := len(nums)
173+
g := make([][]int, n)
174+
indeg := make([]int, n)
175+
for _, seq := range sequences {
176+
for i := 1; i < len(seq); i++ {
177+
a, b := seq[i-1]-1, seq[i]-1
178+
g[a] = append(g[a], b)
179+
indeg[b]++
246180
}
247181
}
248-
var q []int
249-
for i := 1; i <= n; i++ {
250-
if indegree[i] == 0 {
182+
q := []int{}
183+
for i, v := range indeg {
184+
if v == 0 {
251185
q = append(q, i)
252186
}
253187
}
254-
cnt := 0
255188
for len(q) > 0 {
256-
if len(q) > 1 || org[cnt] != q[0] {
189+
if len(q) > 1 {
257190
return false
258191
}
259192
i := q[0]
260193
q = q[1:]
261-
cnt++
262-
for _, j := range edges[i] {
263-
indegree[j]--
264-
if indegree[j] == 0 {
194+
for _, j := range g[i] {
195+
indeg[j]--
196+
if indeg[j] == 0 {
265197
q = append(q, j)
266198
}
267199
}
268200
}
269-
return cnt == n
201+
return true
270202
}
271203
```
272204

Original file line numberDiff line numberDiff line change
@@ -1,47 +1,27 @@
11
class Solution {
22
public:
3-
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
4-
int n = org.size();
5-
unordered_set<int> nums;
6-
for (auto& seq : seqs)
3+
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
4+
int n = nums.size();
5+
vector<vector<int>> g(n);
6+
vector<int> indeg(n);
7+
for (auto& seq : sequences)
78
{
8-
for (int num : seq)
9+
for (int i = 1; i < seq.size(); ++i)
910
{
10-
if (num < 1 || num > n) return false;
11-
nums.insert(num);
12-
}
13-
}
14-
if (nums.size() < n) return false;
15-
vector<vector<int>> edges(n + 1);
16-
vector<int> indegree(n + 1);
17-
for (auto& seq : seqs)
18-
{
19-
int i = seq[0];
20-
for (int j = 1; j < seq.size(); ++j)
21-
{
22-
edges[i].push_back(seq[j]);
23-
++indegree[seq[j]];
24-
i = seq[j];
11+
int a = seq[i - 1] - 1, b = seq[i] - 1;
12+
g[a].push_back(b);
13+
++indeg[b];
2514
}
2615
}
2716
queue<int> q;
28-
for (int i = 1; i <= n; ++i)
29-
{
30-
if (indegree[i] == 0) q.push(i);
31-
}
32-
int cnt = 0;
17+
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
3318
while (!q.empty())
3419
{
35-
if (q.size() > 1 || q.front() != org[cnt]) return false;
36-
++cnt;
20+
if (q.size() > 1) return false;
3721
int i = q.front();
3822
q.pop();
39-
for (int j : edges[i])
40-
{
41-
--indegree[j];
42-
if (indegree[j] == 0) q.push(j);
43-
}
23+
for (int j : g[i]) if (--indeg[j] == 0) q.push(j);
4424
}
45-
return cnt == n;
25+
return true;
4626
}
4727
};
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,32 @@
1-
func sequenceReconstruction(org []int, seqs [][]int) bool {
2-
n := len(org)
3-
nums := make(map[int]bool)
4-
for _, seq := range seqs {
5-
for _, num := range seq {
6-
if num < 1 || num > n {
7-
return false
8-
}
9-
nums[num] = true
10-
}
11-
}
12-
if len(nums) < n {
13-
return false
14-
}
15-
edges := make([][]int, n+1)
16-
indegree := make([]int, n+1)
17-
for _, seq := range seqs {
18-
i := seq[0]
19-
for _, j := range seq[1:] {
20-
edges[i] = append(edges[i], j)
21-
indegree[j]++
22-
i = j
1+
func sequenceReconstruction(nums []int, sequences [][]int) bool {
2+
n := len(nums)
3+
g := make([][]int, n)
4+
indeg := make([]int, n)
5+
for _, seq := range sequences {
6+
for i := 1; i < len(seq); i++ {
7+
a, b := seq[i-1]-1, seq[i]-1
8+
g[a] = append(g[a], b)
9+
indeg[b]++
2310
}
2411
}
25-
var q []int
26-
for i := 1; i <= n; i++ {
27-
if indegree[i] == 0 {
12+
q := []int{}
13+
for i, v := range indeg {
14+
if v == 0 {
2815
q = append(q, i)
2916
}
3017
}
31-
cnt := 0
3218
for len(q) > 0 {
33-
if len(q) > 1 || org[cnt] != q[0] {
19+
if len(q) > 1 {
3420
return false
3521
}
3622
i := q[0]
3723
q = q[1:]
38-
cnt++
39-
for _, j := range edges[i] {
40-
indegree[j]--
41-
if indegree[j] == 0 {
24+
for _, j := range g[i] {
25+
indeg[j]--
26+
if indeg[j] == 0 {
4227
q = append(q, j)
4328
}
4429
}
4530
}
46-
return cnt == n
31+
return true
4732
}
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,35 @@
11
class Solution {
2-
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
3-
int n = org.length;
4-
Set<Integer> nums = new HashSet<>();
5-
for (List<Integer> seq : seqs) {
6-
for (int num : seq) {
7-
if (num < 1 || num > n) {
8-
return false;
9-
}
10-
nums.add(num);
11-
}
12-
}
13-
if (nums.size() < n) {
14-
return false;
15-
}
16-
List<Integer>[] edges = new List[n + 1];
17-
for (int i = 0; i < edges.length; ++i) {
18-
edges[i] = new ArrayList<>();
2+
public boolean sequenceReconstruction(int[] nums, List<List<Integer>> sequences) {
3+
int n = nums.length;
4+
int[] indeg = new int[n];
5+
List<Integer>[] g = new List[n];
6+
for (int i = 0; i < n; ++i) {
7+
g[i] = new ArrayList<>();
198
}
20-
int[] indegree = new int[n + 1];
21-
for (List<Integer> seq : seqs) {
22-
int i = seq.get(0);
23-
for (int j = 1; j < seq.size(); ++j) {
24-
edges[i].add(seq.get(j));
25-
++indegree[seq.get(j)];
26-
i = seq.get(j);
9+
for (var seq : sequences) {
10+
for (int i = 1; i < seq.size(); ++i) {
11+
int a = seq.get(i - 1) - 1, b = seq.get(i) - 1;
12+
g[a].add(b);
13+
indeg[b]++;
2714
}
2815
}
29-
Queue<Integer> q = new LinkedList<>();
30-
for (int i = 1; i <= n; ++i) {
31-
if (indegree[i] == 0) {
16+
Deque<Integer> q = new ArrayDeque<>();
17+
for (int i = 0; i < n; ++i) {
18+
if (indeg[i] == 0) {
3219
q.offer(i);
3320
}
3421
}
35-
int cnt = 0;
3622
while (!q.isEmpty()) {
37-
if (q.size() > 1 || q.peek() != org[cnt]) {
23+
if (q.size() > 1) {
3824
return false;
3925
}
40-
++cnt;
4126
int i = q.poll();
42-
for (int j : edges[i]) {
43-
--indegree[j];
44-
if (indegree[j] == 0) {
27+
for (int j : g[i]) {
28+
if (--indeg[j] == 0) {
4529
q.offer(j);
4630
}
4731
}
4832
}
49-
return cnt == n;
33+
return true;
5034
}
5135
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
11
class Solution:
2-
def sequenceReconstruction(self, org: List[int], seqs: List[List[int]]) -> bool:
3-
n = len(org)
4-
nums = set()
5-
for seq in seqs:
6-
for num in seq:
7-
if num < 1 or num > n:
8-
return False
9-
nums.add(num)
10-
if len(nums) < n:
11-
return False
12-
13-
edges = defaultdict(list)
14-
indegree = [0] * (n + 1)
15-
for seq in seqs:
16-
i = seq[0]
17-
for j in seq[1:]:
18-
edges[i].append(j)
19-
indegree[j] += 1
20-
i = j
21-
q = deque()
22-
for i in range(1, n + 1):
23-
if indegree[i] == 0:
24-
q.append(i)
25-
cnt = 0
2+
def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
3+
g = defaultdict(list)
4+
indeg = [0] * len(nums)
5+
for seq in sequences:
6+
for a, b in pairwise(seq):
7+
g[a - 1].append(b - 1)
8+
indeg[b - 1] += 1
9+
q = deque([i for i, v in enumerate(indeg) if v == 0])
2610
while q:
27-
if len(q) > 1 or org[cnt] != q[0]:
11+
if len(q) > 1:
2812
return False
2913
i = q.popleft()
30-
cnt += 1
31-
for j in edges[i]:
32-
indegree[j] -= 1
33-
if indegree[j] == 0:
14+
for j in g[i]:
15+
indeg[j] -= 1
16+
if indeg[j] == 0:
3417
q.append(j)
35-
return cnt == n
18+
return True

0 commit comments

Comments
 (0)
Please sign in to comment.