前往
大廳
主題

LeetCode - 1743. Restore the Array From Adjacent Pairs 解題心得

Not In My Back Yard | 2024-04-05 12:00:25 | 巴幣 0 | 人氣 30

題目連結:


題目意譯:
現在有一個整數陣列 nums,其是由 n 個相異元素所組成。不過你忘了這些元素怎麼排列了。好險的是,你倒是記得 nums 中每一對的相鄰數字。

你被給定一個大小為 n - 1 的二維整數陣列 adjacentPairs,其中每一個 adjacentPairs[i] = [ui, vi] 代表著元素 ui 和 vi 在 nums 中是相鄰的。

保證 nums 中每一對相鄰元素 nums[i] 和 nums[i + 1] 都會存在於 adjacentPairs 中,可能會作為 [nums[i], nums[i + 1]] 或是 [nums[i + 1], nums[i]] 出現。而這些數對可以按任意順序出現。

回傳原本的陣列 nums。如果有多個答案,則回傳任意一個。

限制:
nums.length == n
adjacentPairs.length == n - 1
adjacentPairs[i].length == 2
2 ≦ n ≦ 10 ^ 5
-10 ^ 5 ≦ nums[i], ui, vi ≦ 10 ^ 5
必定存在某些 nums 使得其所有的相鄰數對都包含於 adjacentPairs 中。



範例測資:
範例 1:
輸入: adjacentPairs = [[2,1],[3,4],[3,2]]
輸出: [1,2,3,4]
解釋: 這個陣列中所有的相鄰數對都包含於 adjacentPairs 中。
注意到 adjacentPairs[i] 不一定是由左至右看的數對之順序。

範例 2:
輸入: adjacentPairs = [[4,-2],[1,4],[-3,1]]
輸出: [-2,4,1,-3]
解釋: 負數是有可能會出現的。
另一個答案是 [-3,1,4,-2],而這也可以作為正解被接受。

範例 3:
輸入: adjacentPairs = [[100000,-100000]]
輸出: [100000,-100000]


解題思維:
由於 nums 中每一對相鄰數對都會出現在其中,再加上 nums 中的數字彼此相異,因此 nums 的開頭與結尾的數字只會各在 adjacentPairs 中出現恰好一次。

因此我們可以找出恰好出現一次的那兩個數字作為端點(可以用一個雜湊表(Hash Table)來儲存數字之間的相鄰關係,有點像是鄰接表(Adjacency List)那個樣子。參見這題的說明),然後剩下就依序填入與端點相鄰的數字,再填入與「與端點相鄰的數字」相鄰的數字……以此類推。最後便可以將 nums 重建回去。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作