444 序列重建

2021-10-09 21:25:29 字數 1779 閱讀 2530

題目描述:

驗證原始的序列 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 適用於所...