58
58
59
59
<!-- 这里可写通用的实现逻辑 -->
60
60
61
- 从度为一的点开始遍历图
61
+ ** 方法一:哈希表**
62
+
63
+ 从度为一的点开始遍历图,可以用 DFS,也可以直接遍历。
64
+
65
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。
62
66
63
67
<!-- tabs:start -->
64
68
69
73
``` python
70
74
class Solution :
71
75
def restoreArray (self , adjacentPairs : List[List[int ]]) -> List[int ]:
72
- graph = defaultdict(list )
73
- for pair in adjacentPairs:
74
- graph[pair[0 ]].append(pair[1 ])
75
- graph[pair[1 ]].append(pair[0 ])
76
- ans = []
77
- vis = set ()
76
+ g = defaultdict(list )
77
+ for a, b in adjacentPairs:
78
+ g[a].append(b)
79
+ g[b].append(a)
80
+ n = len (adjacentPairs) + 1
81
+ ans = [0 ] * n
82
+ for i, v in g.items():
83
+ if len (v) == 1 :
84
+ ans[0 ] = i
85
+ ans[1 ] = v[0 ]
86
+ break
87
+ for i in range (2 , n):
88
+ v = g[ans[i - 1 ]]
89
+ ans[i] = v[0 ] if v[1 ] == ans[i - 2 ] else v[1 ]
90
+ return ans
91
+ ```
78
92
79
- def dfs (idx ):
80
- if idx in vis:
93
+ ``` python
94
+ class Solution :
95
+ def restoreArray (self , adjacentPairs : List[List[int ]]) -> List[int ]:
96
+ def dfs (i ):
97
+ if i in vis:
81
98
return
82
- vis.add(idx)
83
- ans.append(idx)
84
- for nxt in graph[idx]:
85
- dfs(nxt)
86
-
99
+ vis.add(i)
100
+ ans.append(i)
101
+ for j in g[i]:
102
+ dfs(j)
103
+
104
+ g = defaultdict(list )
105
+ for a, b in adjacentPairs:
106
+ g[a].append(b)
107
+ g[b].append(a)
108
+ ans = []
109
+ vis = set ()
87
110
start = - 1
88
- for idx, adj in graph .items():
89
- if len (adj ) == 1 :
90
- start = idx
111
+ for i, v in g .items():
112
+ if len (v ) == 1 :
113
+ start = i
91
114
break
92
-
93
115
dfs(start)
94
116
return ans
95
117
```
@@ -101,32 +123,61 @@ class Solution:
101
123
``` java
102
124
class Solution {
103
125
public int [] restoreArray (int [][] adjacentPairs ) {
104
- Map<Integer , List<Integer > > graph = new HashMap<> ();
105
- for (int [] pair : adjacentPairs) {
106
- graph. computeIfAbsent(pair[0 ], k - > new ArrayList<> ()). add(pair[1 ]);
107
- graph. computeIfAbsent(pair[1 ], k - > new ArrayList<> ()). add(pair[0 ]);
126
+ int n = adjacentPairs. length + 1 ;
127
+ Map<Integer , List<Integer > > g = new HashMap<> ();
128
+ for (int [] e : adjacentPairs) {
129
+ int a = e[0 ], b = e[1 ];
130
+ g. computeIfAbsent(a, k - > new ArrayList<> ()). add(b);
131
+ g. computeIfAbsent(b, k - > new ArrayList<> ()). add(a);
132
+ }
133
+ int [] ans = new int [n];
134
+ for (Map . Entry<Integer , List<Integer > > entry : g. entrySet()) {
135
+ if (entry. getValue(). size() == 1 ) {
136
+ ans[0 ] = entry. getKey();
137
+ ans[1 ] = entry. getValue(). get(0 );
138
+ break ;
139
+ }
140
+ }
141
+ for (int i = 2 ; i < n; ++ i) {
142
+ List<Integer > v = g. get(ans[i - 1 ]);
143
+ ans[i] = v. get(1 ) == ans[i - 2 ] ? v. get(0 ) : v. get(1 );
144
+ }
145
+ return ans;
146
+ }
147
+ }
148
+ ```
149
+
150
+ ``` java
151
+ class Solution {
152
+ public int [] restoreArray (int [][] adjacentPairs ) {
153
+ int n = adjacentPairs. length + 1 ;
154
+ Map<Integer , List<Integer > > g = new HashMap<> ();
155
+ for (int [] e : adjacentPairs) {
156
+ int a = e[0 ], b = e[1 ];
157
+ g. computeIfAbsent(a, k - > new ArrayList<> ()). add(b);
158
+ g. computeIfAbsent(b, k - > new ArrayList<> ()). add(a);
108
159
}
109
160
List<Integer > ans = new ArrayList<> ();
110
161
Set<Integer > vis = new HashSet<> ();
111
162
int start = - 1 ;
112
- for (Map . Entry<Integer , List<Integer > > entry : graph . entrySet()) {
163
+ for (Map . Entry<Integer , List<Integer > > entry : g . entrySet()) {
113
164
if (entry. getValue(). size() == 1 ) {
114
165
start = entry. getKey();
115
166
break ;
116
167
}
117
168
}
118
- dfs(graph , ans, vis, start);
169
+ dfs(g , ans, vis, start);
119
170
return ans. stream(). mapToInt(Integer :: valueOf). toArray();
120
171
}
121
172
122
- private void dfs (Map<Integer , List<Integer > > graph , List<Integer > ans , Set<Integer > vis , int idx ) {
123
- if (vis. contains(idx )) {
173
+ private void dfs (Map<Integer , List<Integer > > g , List<Integer > ans , Set<Integer > vis , int i ) {
174
+ if (vis. contains(i )) {
124
175
return ;
125
176
}
126
- vis. add(idx );
127
- ans. add(idx );
128
- for (Integer next : graph . get(idx )) {
129
- dfs(graph , ans, vis, next );
177
+ vis. add(i );
178
+ ans. add(i );
179
+ for (int j : g . get(i )) {
180
+ dfs(g , ans, vis, j );
130
181
}
131
182
}
132
183
}
@@ -136,36 +187,130 @@ class Solution {
136
187
137
188
``` go
138
189
func restoreArray (adjacentPairs [][]int ) []int {
139
- graph := make (map [int ][]int )
140
- for _ , pair := range adjacentPairs {
141
- graph[pair[0 ]] = append (graph[pair[0 ]], pair[1 ])
142
- graph[pair[1 ]] = append (graph[pair[1 ]], pair[0 ])
190
+ n := len (adjacentPairs) + 1
191
+ g := map [int ][]int {}
192
+ for _ , e := range adjacentPairs {
193
+ a , b := e[0 ], e[1 ]
194
+ g[a] = append (g[a], b)
195
+ g[b] = append (g[b], a)
143
196
}
144
- ans := make ([]int , 0 )
145
- vis := make (map [int ]bool )
146
- var start int
147
- for idx , adj := range graph {
148
- if len (adj) == 1 {
149
- start = idx
197
+ ans := make ([]int , n)
198
+ for k , v := range g {
199
+ if len (v) == 1 {
200
+ ans[0 ] = k
201
+ ans[1 ] = v[0 ]
150
202
break
151
203
}
152
204
}
153
- dfs (graph, &ans, vis, start)
205
+ for i := 2 ; i < n; i++ {
206
+ v := g[ans[i-1 ]]
207
+ ans[i] = v[0 ]
208
+ if v[0 ] == ans[i-2 ] {
209
+ ans[i] = v[1 ]
210
+ }
211
+ }
154
212
return ans
155
213
}
214
+ ```
156
215
157
- func dfs (graph map [int ][]int , ans *[]int , vis map [int ]bool , idx int ) {
158
- if vis[idx] {
159
- return
216
+ ``` go
217
+ func restoreArray (adjacentPairs [][]int ) []int {
218
+ g := map [int ][]int {}
219
+ for _ , e := range adjacentPairs {
220
+ a , b := e[0 ], e[1 ]
221
+ g[a] = append (g[a], b)
222
+ g[b] = append (g[b], a)
223
+ }
224
+ ans := []int {}
225
+ vis := map [int ]bool {}
226
+ var start int
227
+ for i , v := range g {
228
+ if len (v) == 1 {
229
+ start = i
230
+ break
231
+ }
160
232
}
161
- vis[idx] = true
162
- *ans = append (*ans, idx)
163
- for _ , next := range graph[idx] {
164
- dfs (graph, ans, vis, next)
233
+ var dfs func (i int )
234
+ dfs = func (i int ) {
235
+ if vis[i] {
236
+ return
237
+ }
238
+ vis[i] = true
239
+ ans = append (ans, i)
240
+ for _ , j := range g[i] {
241
+ dfs (j)
242
+ }
165
243
}
244
+ dfs (start)
245
+ return ans
166
246
}
167
247
```
168
248
249
+ ### ** C++**
250
+
251
+ ``` cpp
252
+ class Solution {
253
+ public:
254
+ vector<int > restoreArray(vector<vector<int >>& adjacentPairs) {
255
+ int n = adjacentPairs.size() + 1;
256
+ unordered_map<int, vector<int >> g;
257
+ for (auto& e : adjacentPairs) {
258
+ int a = e[ 0] , b = e[ 1] ;
259
+ g[ a] .push_back(b);
260
+ g[ b] .push_back(a);
261
+ }
262
+ vector<int > ans(n);
263
+ for (auto& [ k, v] : g) {
264
+ if (v.size() == 1) {
265
+ ans[ 0] = k;
266
+ ans[ 1] = v[ 0] ;
267
+ break;
268
+ }
269
+ }
270
+ for (int i = 2; i < n; ++i) {
271
+ auto v = g[ ans[ i - 1]] ;
272
+ ans[ i] = v[ 0] == ans[ i - 2] ? v[ 1] : v[ 0] ;
273
+ }
274
+ return ans;
275
+ }
276
+ };
277
+ ```
278
+
279
+ ```cpp
280
+ class Solution {
281
+ public:
282
+ vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
283
+ int n = adjacentPairs.size() + 1;
284
+ unordered_map<int, vector<int>> g;
285
+ for (auto& e : adjacentPairs) {
286
+ int a = e[0], b = e[1];
287
+ g[a].push_back(b);
288
+ g[b].push_back(a);
289
+ }
290
+ vector<int> ans;
291
+ unordered_set<int> vis;
292
+ int start = -1;
293
+ for (auto& [k, v] : g) {
294
+ if (v.size() == 1) {
295
+ start = k;
296
+ break;
297
+ }
298
+ }
299
+ dfs(g, ans, vis, start);
300
+ return ans;
301
+ }
302
+
303
+ void dfs(unordered_map<int, vector<int>>& g, vector<int>& ans, unordered_set<int>& vis, int i) {
304
+ if (vis.count(i)) return;
305
+ ans.push_back(i);
306
+ vis.insert(i);
307
+ for (int j : g[i]) {
308
+ dfs(g, ans, vis, j);
309
+ }
310
+ }
311
+ };
312
+ ```
313
+
169
314
### ** ...**
170
315
171
316
```
0 commit comments