题目描述
存在一个由 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] ,也会被视作正确答案。
思路
- 由题目,数组中与首尾两个元素相邻的各只有一个元素,中间的都有两个相邻元素。 用哈希表先记录每个元素的相邻元素。
- 遍历哈希表,找出相邻元素只有一个的元素。 也就是第一个或者最后一个,因为有多种解答只需要返回任意一个,所以直接让找出的作为第一个元素。然后根据第一个元素的相邻元素,找出第二个元素,接着根据第二个相邻元素,排除掉第一个后,另外一个就是第三个元素,依次类推,求出所有元素。
- 遍历map一般用Map.Entry()方法
putIfAbsent
如果没有这个key,就加进去
代码
class Solution {
public int[] restoreArray(int[][] adjacentPairs) {
Map<Integer, List<Integer>> map = new HashMap<>();
//初始化哈希表,保存每个元素的相邻元素
for (int a[] : adjacentPairs) {
//不存在这个key才添加
map.putIfAbsent(a[0], new ArrayList<Integer>());
map.putIfAbsent(a[1], new ArrayList<Integer>());
map.get(a[0]).add(a[1]);
map.get(a[1]).add(a[0]);
}
int n = map.size();
int res[] = new int [n];
//找一个相邻元素只为1的元素 作为数组第一个元素
for (Map.Entry<Integer, List<Integer>> entry: map.entrySet()) {
int key = entry.getKey();
List<Integer> values = entry.getValue();
if (values.size() == 1){
res[0] = key;
break;
}
}
//根据第一个的相邻元素推出第二个元素
res[1] = map.get(res[0]).get(0);
//根据第二个元素的相邻元素,排除掉第一个后,另外一个推出下一个元素,依次推出所有
for (int i = 2; i < n; i ++ ) {
List<Integer> close = map.get(res[i - 1]);
res[i] = (res[i - 2] == close.get(0)) ? close.get(1) : close.get(0);
}
return res;
}
}