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] = [ui, vi]
indicates that the elements ui
and vi
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.
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.
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.
Input: adjacentPairs = [[100000,-100000]] Output: [100000,-100000]
nums.length == n
adjacentPairs.length == n - 1
adjacentPairs[i].length == 2
2 <= n <= 105
-105 <= nums[i], ui, vi <= 105
- There exists some
nums
that hasadjacentPairs
as its pairs.
use std::collections::HashMap;
impl Solution {
pub fn restore_array(adjacent_pairs: Vec<Vec<i32>>) -> Vec<i32> {
let mut adjacent = HashMap::new();
let mut ret = vec![];
for pair in &adjacent_pairs {
adjacent.entry(pair[0]).or_insert(vec![]).push(pair[1]);
adjacent.entry(pair[1]).or_insert(vec![]).push(pair[0]);
}
let mut curr = *adjacent.iter().find(|(_, v)| v.len() == 1).unwrap().0;
ret.push(curr);
for i in 0..adjacent_pairs.len() {
curr = match &adjacent.get(&curr).unwrap()[..] {
&[x] => x,
&[x, y] if x != ret[i - 1] => x,
&[x, y] => y,
_ => 0,
};
ret.push(curr);
}
ret
}
}