九章演算法 愛彼迎面試題 序列重構

2021-10-22 20:50:42 字數 2263 閱讀 6508

描述

判斷是否序列 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

題解

九章演算法班裡講過的拓撲排序,只要保證 queue 裡最多同時只有乙個元素即可。 所以這是 queue 用 list 然後每次 pop 也可以,反正只有乙個數。

class solution:

"""@param org: a permutation of the integers from 1 to n

@param seqs: a list of sequences

@return: true if it can be reconstructed only one or false

"""def sequencereconstruction(self, org, seqs):

graph = self.build_graph(seqs)

topo_order = self.topological_sort(graph)

return topo_order == org

def build_graph(self, seqs):

# initialize graph

graph = {}

for seq in seqs:

for node in seq:

if node not in graph:

graph[node] = set()

for seq in seqs:

for i in range(1, len(seq)):

graph[seq[i - 1]].add(seq[i])

return graph

def get_indegrees(self, graph):

indegrees =

for node in graph:

for neighbor in graph[node]:

indegrees[neighbor] += 1

return indegrees

def topological_sort(self, graph):

indegrees = self.get_indegrees(graph)

queue =

for node in graph:

if indegrees[node] == 0:

topo_order =

while queue:

if len(queue) > 1:

# there must exist more than one topo orders

return none

node = queue.pop()

for neighbor in graph[node]:

indegrees[neighbor] -= 1

if indegrees[neighbor] == 0:

if len(topo_order) == len(graph):

return topo_order

return none

更多題解參考

九章演算法 Google面試題 內積

描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...

九章演算法面試題32 小球排序

有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...

九章演算法面試題33 陣列波峰

乙個陣列a 1.n 假設陣列中沒有任何相鄰兩數相等,滿足a 1 n。a i 被稱為波峰,當且僅當a i a i 1 並且a i a i 1 請找到陣列中的乙個波峰。假設陣列中存在相鄰相等的數,該怎麼做?根據條件a 1 a n 可知a中一定存在波峰。用二分法,選擇中點mid,如果a mid 是波峰,則...