DFS應用題 重建陣列 Restore the Array From Adj Pairs_Leetcode #1743

閱讀時間約 6 分鐘
raw-image

這題的題目在這裡:Restore the Array From Adjacent Pairs

題目敘述

題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。

要求我們從pair陣列重建出原本的陣列。

答案可能有不只一組,任選一組回傳即可。


測試範例

Example 1:

Input: adjacentPairs = [[2,1],[3,4],[3,2]]
Output: [1,2,3,4]
Explanation: This array has all its adjacent pairs in adjacentPairs.
Notice that adjacentPairs[i] may not be in left-to-right order.

Example 2:

Input: adjacentPairs = [[4,-2],[1,4],[-3,1]]
Output: [-2,4,1,-3]
Explanation: There can be negative numbers.
Another solution is [-3,1,4,-2], which would also be accepted.

Example 3:

Input: adjacentPairs = [[100000,-100000]]
Output: [100000,-100000]

約束條件

Constraints:

  • nums.length == n
  • adjacentPairs.length == n - 1
  • adjacentPairs[i].length == 2
  • 2 <= n <= 10^5
  • -10^5 <= nums[i], ui, vi <= 10^5
  • There exists some nums that has adjacentPairs as its pairs.

演算法

其實相鄰的pair就對應到圖論中的兩條指向邊

一條是u->v,另一條是v->u。

u,v就對應到pair裡面的兩個數字。

舉例來說

Given adjacentPairs = [[2,1],[3,4],[3,2]]

Corresponding graph in G

1 <-> 2 <-> 3 <-> 4

[2,1]就代表有一條指向邊1->2 和 另一條指向邊 2->1

[3,4]就代表有一條指向邊3->4 和 另一條指向邊 4->3

[3,2]就代表有一條指向邊3->2 和 另一條指向邊 2->3


如果,從端點1出發,那麼DFS走完整張圖的結果是1->2->3->4

可以還原出陣列[1,2,3,4]


如果,從端點4出發,那麼DFS走完整張圖的結果是4->3->2->1

可以還原出陣列[4,3,2,1]


兩個都是對的答案,任選其中一組回傳即可。


用pair重建整個graph,以adjacency list的形式儲存起來。

接著,以端點(只出現一次的數值)為出發點,用DFS走訪整張圖,途中經過的路徑,就是還原後的答案,也就是重建好的原始陣列


程式碼

class Solution:
 def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:

  graph = defaultdict(list)

  # update adjacent list in Graph G
  for u, v in adjacentPairs:
   graph[u].append(v)
   graph[v].append(u)
  
  array = []

  # Locate starting node whose occurrence = 1
  start = next(x for x in graph if len(graph[x]) == 1)

  def dfs(node, prev):

   # Restore array element   
   array.append(node)

   # DFS to next neighbor, and never go back
   for neighbor in graph[node]:
    if neighbor != prev:
     dfs(neighbor, node)

   return
  # ================================

  # Launch DFS from starting node
  dfs(node=start, prev=None)
  return array

複雜度分析

時間複雜度:

O(n) DFS拜訪整張圖 = O(V)+ O(E) = O(n)。

建Graph的時間成本 = 掃描 adjacentPairs 的成本 = O(n)

空間複雜度:

O(n) DFS拜訪整張圖 = O(V) = O(n)。

建Graph的空間成本 = graph 這張表的成本 = O(2n) = O(n)


關鍵知識點

聯想到其實相鄰的pair就對應到圖論中的兩條指向邊

一條是u->v,另一條是v->u。

u,v就對應到pair裡面的兩個數字。

舉例來說

Given adjacentPairs = [[2,1],[3,4],[3,2]]

Corresponding graph in G

1 <-> 2 <-> 3 <-> 4

[2,1]就代表有一條指向邊1->2 和 另一條指向邊 2->1

[3,4]就代表有一條指向邊3->4 和 另一條指向邊 4->3

[3,2]就代表有一條指向邊3->2 和 另一條指向邊 2->3


Reference:

[1] Python O(n) by DFS [w/ Demo] - Restore the Array From Adjacent Pairs - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
世上真的有所謂的「愛人如己」嗎? 佛洛姆指出「兄弟愛」是所有類型的愛的基礎,因為它是一種普世性質的:只有你是人類,我對你就要有某種責任、尊重和了解。具體來說,因為兄弟愛,所以耶穌能愛每一個世人,加爾各答德蕾莎修女能夠親近每一個窮人,達賴喇嘛能夠對每一個聽眾,不論是男或女、是大人或小孩,都給予一樣的
Thumbnail
網路溫暖,有時甚至勝之於社會。感謝「格友」及「蛙友」。 梅特卡夫定律:一個網路的價值等於該網路內的節點數的平方,而且該網路的價值與聯網的使用者數的平
Thumbnail
每個星期,在竹山台西客運一樓的候車大廳,總會出現這麼一個熱鬧場景,竹編的菜籃擺滿一地,工作人員(大多是社區媽媽)手上拿著清單一一點名,玉米筍一包、香菇一盒、白菜一顆……,他們在為「足安心蔬菜箱」的消費者配菜。
Thumbnail
下個月就是新的一年的開始,無論是西元年或是農曆年。 在這個歲末年初的時間點,大家最喜歡的就是設定新年的目標。為自己重新定調,期待建立嶄新的一年! 我也很喜歡在12月計劃下一年度的目標,在設定目標的時候總是滿懷欣喜,開心的想著一一達成目標後的豐盛來年!
Thumbnail
上回提到的今昔女神祟拜獲得不少迴響,看來公元前的上古女神們,在21世紀仍然能夠如同林襄一樣獲得大家的青睞。接下來,就讓大家來鑑賞一個上古女神們的雕塑,看看她的美能否經得起數千年時間的考驗,博得你的喜愛…
Thumbnail
許多赴中國發展的藝人,在政治正確的大方向上,諸多討好中國,貶低台灣的言論,早已經族繁不及備載。為何偏偏楊丞琳的一席「海鮮在台灣是奢侈」的內容,會特別掀起台灣網友的討論? 先不論以上這些是是非非。我想從另一個角度來看待這問題,也就是『食物與肥胖』來看貧富不均的問題。
Thumbnail
楊士芳你一定都沒聽過這個人,那麼楊士芳是誰啊??楊士芳反映台灣人文與愛護鄉土先驅,現在台灣各地常說的社區營造、地方創生概念都是來自楊士芳背後所代表精神。 楊士芳紀念林園相關資訊:: 地址: 宜蘭縣宜蘭市舊城西路66號 開放時間: 開放空間 (無時間限制) 電話: 備註: 庭園、博物館園區 地址:
Thumbnail
過完年如果你打算求職、轉換跑道往大公司發展,不妨先看看我在大公司就職近 6 年所歸納的叢林法則,預先了解進大公司該有的體悟與準備,以求生存...
Thumbnail
投資世界充滿風險與機會,你可以在巿場賺到豐厚的身家,也可以在巿場中損失全部的本金,關鍵在於投資者對投資世界的認知,以及在投資前的準備和付出。
Thumbnail
本篇參考Michel Chion〈Chaplin: Three Steps into Speech〉一文,從中提選重點並加入觀點編寫,談談這位小流浪漢如何從默片《City Light城市之光》、《Modern Times摩登時代》、《The Great dictator大獨裁者》,迎向有聲片來臨。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
世上真的有所謂的「愛人如己」嗎? 佛洛姆指出「兄弟愛」是所有類型的愛的基礎,因為它是一種普世性質的:只有你是人類,我對你就要有某種責任、尊重和了解。具體來說,因為兄弟愛,所以耶穌能愛每一個世人,加爾各答德蕾莎修女能夠親近每一個窮人,達賴喇嘛能夠對每一個聽眾,不論是男或女、是大人或小孩,都給予一樣的
Thumbnail
網路溫暖,有時甚至勝之於社會。感謝「格友」及「蛙友」。 梅特卡夫定律:一個網路的價值等於該網路內的節點數的平方,而且該網路的價值與聯網的使用者數的平
Thumbnail
每個星期,在竹山台西客運一樓的候車大廳,總會出現這麼一個熱鬧場景,竹編的菜籃擺滿一地,工作人員(大多是社區媽媽)手上拿著清單一一點名,玉米筍一包、香菇一盒、白菜一顆……,他們在為「足安心蔬菜箱」的消費者配菜。
Thumbnail
下個月就是新的一年的開始,無論是西元年或是農曆年。 在這個歲末年初的時間點,大家最喜歡的就是設定新年的目標。為自己重新定調,期待建立嶄新的一年! 我也很喜歡在12月計劃下一年度的目標,在設定目標的時候總是滿懷欣喜,開心的想著一一達成目標後的豐盛來年!
Thumbnail
上回提到的今昔女神祟拜獲得不少迴響,看來公元前的上古女神們,在21世紀仍然能夠如同林襄一樣獲得大家的青睞。接下來,就讓大家來鑑賞一個上古女神們的雕塑,看看她的美能否經得起數千年時間的考驗,博得你的喜愛…
Thumbnail
許多赴中國發展的藝人,在政治正確的大方向上,諸多討好中國,貶低台灣的言論,早已經族繁不及備載。為何偏偏楊丞琳的一席「海鮮在台灣是奢侈」的內容,會特別掀起台灣網友的討論? 先不論以上這些是是非非。我想從另一個角度來看待這問題,也就是『食物與肥胖』來看貧富不均的問題。
Thumbnail
楊士芳你一定都沒聽過這個人,那麼楊士芳是誰啊??楊士芳反映台灣人文與愛護鄉土先驅,現在台灣各地常說的社區營造、地方創生概念都是來自楊士芳背後所代表精神。 楊士芳紀念林園相關資訊:: 地址: 宜蘭縣宜蘭市舊城西路66號 開放時間: 開放空間 (無時間限制) 電話: 備註: 庭園、博物館園區 地址:
Thumbnail
過完年如果你打算求職、轉換跑道往大公司發展,不妨先看看我在大公司就職近 6 年所歸納的叢林法則,預先了解進大公司該有的體悟與準備,以求生存...
Thumbnail
投資世界充滿風險與機會,你可以在巿場賺到豐厚的身家,也可以在巿場中損失全部的本金,關鍵在於投資者對投資世界的認知,以及在投資前的準備和付出。
Thumbnail
本篇參考Michel Chion〈Chaplin: Three Steps into Speech〉一文,從中提選重點並加入觀點編寫,談談這位小流浪漢如何從默片《City Light城市之光》、《Modern Times摩登時代》、《The Great dictator大獨裁者》,迎向有聲片來臨。