代码有点复杂,思路就是用HashMap存放邻接关系,然后直接找出起始点,依次取
发布于 3 小时前9哈希表
解题思路
此处撰写解题思路
代码
class Solution {
public static int[] restoreArray(int[][] adjacentPairs) {
int size = adjacentPairs.length;
int []rs = new int[size +1];
final int start = 0, end = 1;
HashMap<Integer, int[]> key = new HashMap<>();
for (int i = 0; i < size; i++) {
int temp [] = new int[2];
temp[start] = i; temp[end] = -1;//默认情况下只存起始点所在的adjacentPairs中的位置
if(key.get(adjacentPairs[i][start]) == null) {
key.put(adjacentPairs[i][start], temp);
}else {
temp = key.get(adjacentPairs[i][start]);//必须重新获取,然后给其赋值其end为当前i
temp[end] = i;
key.put(adjacentPairs[i][start], temp);//set进去
}
temp = new int[2];//必须重新新建 不能用之前的temp,否则会出错
temp[start] = i; temp[end] = -1;
if(key.get(adjacentPairs[i][end]) == null) {
key.put(adjacentPairs[i][end], temp);
}else {
temp = key.get(adjacentPairs[i][end]);
temp[end] = i;
key.put(adjacentPairs[i][end], temp);//同上
}
}//最后存放的数据即《key, {start, end}》 key表示元素值,start和end表示在adjacentPairs出现的;两个下标,当end 是-1时候,表示改key可以做为数组的首元素或者尾元素
int startEnd[] = new int[2], i = 0;
for (Integer k : key.keySet()) {
if (key.get(k)[end] == -1){
startEnd[i++] = k;
}
if(i==2) break;
}//找到首,尾元素了
rs[0] = startEnd[start];rs[rs.length - 1] = startEnd[end];//设置首,尾元素
int visitedIndex = -1;//因为一个元素可能出现两次位置,其中一个位置是刚刚走过的,防止重新走
for (int j = 0; j < rs.length-2;j++) {
int[] val = key.get(rs[j]);//获取rs[j]对应的两个位置,start,一定是合法的值,其中有两个元素(结果数组的首尾)的end为-1
int[] path = adjacentPairs[val[start]];//获取其中未被访问的那对邻接关系
if(visitedIndex == val[start]&&val[end] != -1){//获取其中未被访问的那对邻接关系
path = adjacentPairs[val[end]];
visitedIndex = val[end];
}else {
visitedIndex = val[start];
}
if(rs[j]==path[start]){
rs[j+1] = path[end];
}else if(rs[j]==path[end]){
rs[j+1] = path[start];
}//下一个元素
if(rs[j]==path[start]){
rs[j+1] = path[end];
}else if(rs[j]==path[end]){
rs[j+1] = path[start];
}//下一个元素
}
return rs;
}
}
下一