Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1743.html
1743. Restore the Array From Adjacent Pairs
Level
Medium
Description
There is an integer array nums
that consists of n
unique elements, but you have forgotten it. However, you do remember every pair of adjacent elements in nums
.
You are given a 2D integer array adjacentPairs
of size n - 1
where each adjacentPairs[i] = [u_i, v_i]
indicates that the elements u_i
and v_i
are adjacent in nums
.
It is guaranteed that every adjacent pair of elements nums[i]
and nums[i+1]
will exist in adjacentPairs
, either as [nums[i], nums[i+1]]
or [nums[i+1], nums[i]]
. The pairs can appear in any order.
Return the original array nums
. If there are multiple solutions, return any of them.
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 hasadjacentPairs
as its pairs.
Solution
All elements in nums
occur twice in adjacentPairs
except the two elements that are at the start and the end of nums
. Therefore, start from the two elements that occur only once in adjacentPairs
, put them at index 0 and index n - 1
of nums
respectively. The two elements at indices 1 and n - 2
can be determined as well. For i
from 1 to n - 2
, obtain the adjacent numbers of nums[i]
and set nums[i + 1]
as the remaining element (that is differnet from nums[i - 1]
). Finally, return nums
.
-
class Solution { public int[] restoreArray(int[][] adjacentPairs) { Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); for (int[] adjacentPair : adjacentPairs) { int num1 = adjacentPair[0], num2 = adjacentPair[1]; List<Integer> list1 = map.getOrDefault(num1, new ArrayList<Integer>()); List<Integer> list2 = map.getOrDefault(num2, new ArrayList<Integer>()); list1.add(num2); list2.add(num1); map.put(num1, list1); map.put(num2, list2); } int length = adjacentPairs.length + 1; int[] nums = new int[length]; boolean flag = false; Set<Integer> set = map.keySet(); for (int num : set) { List<Integer> list = map.get(num); if (list.size() == 1) { if (!flag) { nums[0] = num; nums[1] = list.get(0); flag = true; } else { nums[length - 1] = num; nums[length - 2] = list.get(0); } } } for (int i = 1; i < length - 1; i++) { int num = nums[i]; List<Integer> list = map.get(num); for (int adjacent : list) { if (adjacent != nums[i - 1]) { nums[i + 1] = adjacent; break; } } } return nums; } } ############ class Solution { public int[] restoreArray(int[][] adjacentPairs) { int n = adjacentPairs.length + 1; Map<Integer, List<Integer>> g = new HashMap<>(); for (int[] e : adjacentPairs) { int a = e[0], b = e[1]; g.computeIfAbsent(a, k -> new ArrayList<>()).add(b); g.computeIfAbsent(b, k -> new ArrayList<>()).add(a); } int[] ans = new int[n]; for (Map.Entry<Integer, List<Integer>> entry : g.entrySet()) { if (entry.getValue().size() == 1) { ans[0] = entry.getKey(); ans[1] = entry.getValue().get(0); break; } } for (int i = 2; i < n; ++i) { List<Integer> v = g.get(ans[i - 1]); ans[i] = v.get(1) == ans[i - 2] ? v.get(0) : v.get(1); } return ans; } }
-
class Solution: def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]: g = defaultdict(list) for a, b in adjacentPairs: g[a].append(b) g[b].append(a) n = len(adjacentPairs) + 1 ans = [0] * n for i, v in g.items(): if len(v) == 1: ans[0] = i ans[1] = v[0] break for i in range(2, n): v = g[ans[i - 1]] ans[i] = v[0] if v[1] == ans[i - 2] else v[1] return ans ############ # 1743. Restore the Array From Adjacent Pairs # https://leetcode.com/problems/restore-the-array-from-adjacent-pairs class Solution: def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]: neigh = collections.defaultdict(list) res = [] for a,b in adjacentPairs: neigh[a].append(b) neigh[b].append(a) for nei in neigh: if len(neigh[nei]) == 1: res.append(nei) res.append(neigh[nei][0]) break while len(res) < len(adjacentPairs) + 1: prev, head = res[len(res)-2], res[-1] nei = neigh[head] if nei[0] == prev: res.append(nei[1]) else: res.append(nei[0]) return res
-
class Solution { public: vector<int> restoreArray(vector<vector<int>>& adjacentPairs) { int n = adjacentPairs.size() + 1; unordered_map<int, vector<int>> g; for (auto& e : adjacentPairs) { int a = e[0], b = e[1]; g[a].push_back(b); g[b].push_back(a); } vector<int> ans(n); for (auto& [k, v] : g) { if (v.size() == 1) { ans[0] = k; ans[1] = v[0]; break; } } for (int i = 2; i < n; ++i) { auto v = g[ans[i - 1]]; ans[i] = v[0] == ans[i - 2] ? v[1] : v[0]; } return ans; } };
-
func restoreArray(adjacentPairs [][]int) []int { n := len(adjacentPairs) + 1 g := map[int][]int{} for _, e := range adjacentPairs { a, b := e[0], e[1] g[a] = append(g[a], b) g[b] = append(g[b], a) } ans := make([]int, n) for k, v := range g { if len(v) == 1 { ans[0] = k ans[1] = v[0] break } } for i := 2; i < n; i++ { v := g[ans[i-1]] ans[i] = v[0] if v[0] == ans[i-2] { ans[i] = v[1] } } return ans }
-
public class Solution { public int[] RestoreArray(int[][] adjacentPairs) { int n = adjacentPairs.Length + 1; Dictionary<int, List<int>> g = new Dictionary<int, List<int>>(); foreach (int[] e in adjacentPairs) { int a = e[0], b = e[1]; if (!g.ContainsKey(a)) { g[a] = new List<int>(); } if (!g.ContainsKey(b)) { g[b] = new List<int>(); } g[a].Add(b); g[b].Add(a); } int[] ans = new int[n]; foreach (var entry in g) { if (entry.Value.Count == 1) { ans[0] = entry.Key; ans[1] = entry.Value[0]; break; } } for (int i = 2; i < n; ++i) { List<int> v = g[ans[i - 1]]; ans[i] = v[1] == ans[i - 2] ? v[0] : v[1]; } return ans; } }