Skip to content

Latest commit

 

History

History
72 lines (58 loc) · 2.52 KB

File metadata and controls

72 lines (58 loc) · 2.52 KB

1743. Restore the Array From Adjacent Pairs

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.

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 <= 105
  • -105 <= nums[i], ui, vi <= 105
  • There exists some nums that has adjacentPairs as its pairs.

Solutions (Rust)

1. Solution

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
    }
}