Skip to content

Commit c9b8e40

Browse files
committed
feat: add solutions to lc problem: No.1743
No.1743.Restore the Array From Adjacent Pairs
1 parent 9e4f989 commit c9b8e40

File tree

7 files changed

+454
-162
lines changed

7 files changed

+454
-162
lines changed

solution/1400-1499/1433.Check If a String Can Break Another String/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
**方法一:排序**
5151

52-
将字符串 $s1$, $s2$ 分别进行升序排序。然后同时遍历两个字符串,对应字符进行大小比较。若对于任意 $i∈[0, n),都有$ $s1[i] \le s2[i]$,或者都有 $s1[i] \ge s2[i]$,则存在一个排列可以打破另一个排列。
52+
将字符串 $s1$, $s2$ 分别进行升序排序。然后同时遍历两个字符串,对应字符进行大小比较。若对于任意 $i∈[0, n),都有 $s1[i] \le s2[i]$,或者都有 $s1[i] \ge s2[i]$,则存在一个排列可以打破另一个排列。
5353

5454
时间复杂度 $O(nlogn)$。
5555

solution/1700-1799/1743.Restore the Array From Adjacent Pairs/README.md

+193-48
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61-
从度为一的点开始遍历图
61+
**方法一:哈希表**
62+
63+
从度为一的点开始遍历图,可以用 DFS,也可以直接遍历。
64+
65+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。
6266

6367
<!-- tabs:start -->
6468

@@ -69,27 +73,45 @@
6973
```python
7074
class Solution:
7175
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+
```
7892

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:
8198
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()
87110
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
91114
break
92-
93115
dfs(start)
94116
return ans
95117
```
@@ -101,32 +123,61 @@ class Solution:
101123
```java
102124
class Solution {
103125
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);
108159
}
109160
List<Integer> ans = new ArrayList<>();
110161
Set<Integer> vis = new HashSet<>();
111162
int start = -1;
112-
for (Map.Entry<Integer, List<Integer>> entry : graph.entrySet()) {
163+
for (Map.Entry<Integer, List<Integer>> entry : g.entrySet()) {
113164
if (entry.getValue().size() == 1) {
114165
start = entry.getKey();
115166
break;
116167
}
117168
}
118-
dfs(graph, ans, vis, start);
169+
dfs(g, ans, vis, start);
119170
return ans.stream().mapToInt(Integer::valueOf).toArray();
120171
}
121172

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)) {
124175
return;
125176
}
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);
130181
}
131182
}
132183
}
@@ -136,36 +187,130 @@ class Solution {
136187

137188
```go
138189
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)
143196
}
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]
150202
break
151203
}
152204
}
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+
}
154212
return ans
155213
}
214+
```
156215

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+
}
160232
}
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+
}
165243
}
244+
dfs(start)
245+
return ans
166246
}
167247
```
168248

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+
169314
### **...**
170315

171316
```

0 commit comments

Comments
 (0)