題目描述:
驗證原始的序列 org 是否可以從序列集 seqs 中唯一地重建。序列 org 是 1 到 n 整數的排列,其中 1 ≤ n ≤ 104。重建是指在序列集 seqs 中構建最短的公共超序列。(即使得所有 seqs 中的序列都是該最短序列的子串行)。確定是否只可以從 seqs 重建唯一的序列,且該序列就是 org 。
示例 1:
輸入:org: [1,2,3], seqs: [[1,2],[1,3]]
輸出:false
解釋:[1,2,3] 不是可以被重建的唯一的序列,因為 [1,3,2] 也是乙個合法的序列。
示例 2:
輸入:org: [1,2,3], seqs: [[1,2]]
輸出:false
解釋:可以重建的序列只有 [1,2]。
示例 3:
輸入:org: [1,2,3], seqs: [[1,2],[1,3],[2,3]]
輸出:true
解釋:序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建為原始的序列 [1,2,3]。
示例 4:
輸入:org: [4,1,5,2,6,3], seqs: [[5,2,6,3],[4,1,5,2]]
輸出:true
方法1:
主要思路:
(1)先判斷給出的序列集中包含的所有元素,是否是1到 n的所有的元素;
(2)根據給出的序列集,建立出度的有向圖,並統計各個點的入度;
(3)在建好的圖中,進行拓撲排序,且保證只能建立一種順序,則排序的過程中,要保證每次排序時,起始的結點,既入度為0的點只有乙個(這個使用佇列的大小進行判斷);
(4)對排好的序列,進行判斷,既首先大小要和給出的陣列相同,其次,各個元素要相同;
class
solution
signs[num]
=true;}
}for
(int i=
1;i<=n;
++i)
}//建有向出度圖和統計入度
vectorint>>
graph
(n+1);
vector<
int>
indegree
(n+1,0
);for(vector<
int>
& vec:seqs)
}//找出起始的結點
queue<
int> q;
for(
int i=
1;i<=n;
++i)
} vector<
int> res;
//儲存排序後的序列
while
(!q.
empty()
)//取出當前結點
int cur=q.
front()
; q.
pop();
res.
push_back
(cur)
;//更新相關的入讀圖
for(
int& num:graph[cur])}
}//先判斷大小
if(res.
size()
!=n)
//再判斷一致性
return res==org;}}
;
LeetCode 444 序列重建(拓撲排序)
驗證原始的序列 org 是否可以從序列集 seqs 中唯一地重建。序列 org 是 1 到 n 整數的排列,其中 1 n 104。重建是指在序列集 seqs 中構建最短的公共超序列。即使得所有 seqs 中的序列都是該最短序列的子串行 確定是否只可以從 seqs 重建唯一的序列,且該序列就是 org...
30 序列構造
給定兩個長度為 n 的正整數序列 a a1,a2,an 和 b b1,b2,bn 現在你選擇 k 個數構成序列 p p1,p2,pk 使得 序列 p 中的元素是不重複的1 pi n 其中1 i k2 ap1 a pk 大於序列 a 所有元素的和2 bp1 b pk 大於序列 b 所有元素的和 k 小...
192220序列型別
序列表示索引未非負整數的有序物件集合,包括字串,列表,元祖。說明 舉例 元祖跟裡面的逗號相關 mytuple a b c d type mytuple 列表根中括號相關 mylist a b c d type mylist 字串跟雙引號有關 mystr a,b,c,d type mystr 適用於所...