这道题要求你恢复一个数组的原始顺序,是一道无向图的题目,也非常简单,首先获得这个数组的首尾,在给定邻居关系中只出现一次的就是首与尾,而且哪个是首哪个是尾也不重要。找一个当首,然后依次去连通就可以了。因为题目中明确指出,数组中每个元素都不相同,所以可以用一个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;
}
};