Leetcode 1743 Restore the Array From Adjacent Pairs

这道题要求你恢复一个数组的原始顺序,是一道无向图的题目,也非常简单,首先获得这个数组的首尾,在给定邻居关系中只出现一次的就是首与尾,而且哪个是首哪个是尾也不重要。找一个当首,然后依次去连通就可以了。因为题目中明确指出,数组中每个元素都不相同,所以可以用一个set来记录出现过的元素,一个元素的两个邻居(首尾元素只有一个邻居)中,没出现过的就是下一个元素。

static int x = [] () {ios::sync_with_stdio(false); cin.tie(0); return 0;} ();
class Solution {
 public:
  vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
    vector<int> res (adjacentPairs.size() + 1);
    unordered_map<int, int> nums;
    unordered_map<int, vector<int>> g;
    set<int> visited;
    for (const auto &a: adjacentPairs) {
      ++nums[a[0]];
      ++nums[a[1]];
      g[a[0]].emplace_back(a[1]);
      g[a[1]].emplace_back(a[0]);
    }
    vector<int> head_tail;
    for (auto &[key, val]: nums) {
      if (val == 1) head_tail.emplace_back(key);
      if (head_tail.size() == 2) break;
    }
    res.front() = head_tail.front();
    res.back() = head_tail.back();
    visited.insert(res.front());
    visited.insert(res.back());
    for (int i = 0, n = adjacentPairs.size() - 1; i < n; ++i) {
      for (int next: g[res[i]])
        if (visited.count(next) == 0) {
          res[i + 1] = next;
          visited.insert(next);
        }
    }
    return res;
  }
};

#直达链接

LeetCode 1743. Restore the Array From Adjacent Pairs