题目描述
存在一个由 n 个不同元素组成的整数数组 nums ,但你已经记不清具体内容。
好在你还记得 nums 中的每一对相邻元素。
给你一个二维整数数组 adjacentPairs ,大小为 n - 1 ,
其中每个 adjacentPairs[i] = [ui, vi] 表示元素 ui 和 vi 在 nums 中相邻。
题目数据保证所有由元素 nums[i] 和 nums[i+1] 组成的相邻元素对都存在于 adjacentPairs 中,
存在形式可能是 [nums[i], nums[i+1]] ,也可能是 [nums[i+1], nums[i]] 。
这些相邻元素对可以 按任意顺序 出现。
返回 原始数组 nums 。如果存在多种解答,返回 其中任意一个 即可。
示例 1:
输入:adjacentPairs = [[2,1],[3,4],[3,2]]
输出:[1,2,3,4]
解释:数组的所有相邻元素对都在 adjacentPairs 中。
特别要注意的是,adjacentPairs[i] 只表示两个元素相邻,并不保证其 左-右 顺序。
示例 2:
输入:adjacentPairs = [[4,-2],[1,4],[-3,1]]
输出:[-2,4,1,-3]
解释:数组中可能存在负数。
另一种解答是 [-3,1,4,-2] ,也会被视作正确答案。
示例 3:
输入:adjacentPairs = [[100000,-100000]]
输出:[100000,-100000]
提示:
nums.length == n
adjacentPairs.length == n - 1
adjacentPairs[i].length == 2
2 <= n <= 105
-105 <= nums[i], ui, vi <= 105
题目数据保证存在一些以 adjacentPairs 作为元素对的数组 nums
算法1
我们有了两者邻接的记录 那么尝试构造邻接的链表即可
使用哈希记录两者邻接记录可以加速查找过程。
deque或者链表方便头尾插入,可以更好的构造链表
C++ 代码
class Solution {
public:
unordered_map<int, vector<int>> vv;
deque<int> dq;
void dfs(int a, int b) {
int aflag = 0; int bflag = 0;
int aleft = vv[a][0];
if (aleft == dq[1] && vv[a].size() > 1) {
aleft = vv[a][1];
}
if (aleft != dq[1]) {
dq.push_front(aleft);
aflag = 1;
}
int bright = vv[b][0]; int backIdx = dq.size() - 1;
if (bright == dq[backIdx - 1] && vv[b].size() > 1) {
bright = vv[b][1];
}
if (bright != dq[backIdx - 1]) {
bflag = 1;
dq.push_back(bright);
}
if (aflag == 0 && bflag == 0) return;
if (aflag == 0) aleft = a;
if (bflag == 0) bright = b;
dfs(aleft, bright);
}
vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
for (int i = 0; i < adjacentPairs.size(); i++) {
int a = adjacentPairs[i][0];
int b = adjacentPairs[i][1];
vv[a].push_back(b);
vv[b].push_back(a);
}
int a = adjacentPairs[0][0]; int b = adjacentPairs[0][1];
dq.push_front(a); dq.push_back(b);
dfs(a, b);
vector<int> ans(dq.begin(), dq.end());
return ans;
}
};
算法2
观察到链表的头尾只有一个连接节点 所以找到头 然后根据其相邻节点一路找下来就能恢复链表了
class Solution {
public:
map<int, vector<int>> mm;
vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
for (int i = 0; i < adjacentPairs.size(); i++) {
int a = adjacentPairs[i][0]; int b = adjacentPairs[i][1];
mm[a].push_back(b); mm[b].push_back(a);
}
vector<int> ans; int head = 0;
for (auto e : mm) {
if (e.second.size() == 1) {
head = e.first;break;
}
}
int prev = head; int curr = head; int next = 0;
while (1) {
ans.push_back(curr);
next = mm[curr][0];
if (mm[curr].size() == 1 && next == prev) {
//找到了结尾
break;
}
else {
if (next == prev) {
next = mm[curr][1];
}
prev = curr; curr = next;
}
}
return ans;
}
};