forked from DengWangBao/Leetcode-Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReconstructItinerary.java
128 lines (110 loc) · 3.9 KB
/
ReconstructItinerary.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import java.util.*;
/**
* 这题有两个前提
* 1, 必须从JFK开始
* 2, 解一定存在
*/
/**
* 这题有两种解法:
* 1, 常规是DFS暴力解法,面试能写出这种就行了
* 2, 欧拉解法
*/
public class ReconstructItinerary {
/**
* 常规DFS暴力列出所有可能的路径,可以一次走遍所有的边
*/
public List<List<String>> findItinerary(String[][] tickets) {
HashMap<String, ArrayList<String>> map = new HashMap<>();
for (String[] ticket : tickets) {
map.computeIfAbsent(ticket[0], k -> new ArrayList<>()).add(ticket[1]);
}
List<List<String>> result = new LinkedList<>();
dfs("JFK", result, map, new LinkedList<>(Arrays.asList("JFK")), tickets.length);
return result;
}
void dfs(String airport, List<List<String>> result, HashMap<String, ArrayList<String>> map, LinkedList<String> route, int n) {
if (route.size() == n + 1) {
result.add(new ArrayList<>(route));
return;
}
if (!map.containsKey(airport) || map.get(airport).isEmpty()) {
return;
}
ArrayList<String> list = map.get(airport);
for (int i = 0; i < list.size(); i++) {
String target = list.remove(i);
route.add(target);
dfs(target, result, map, route, n);
route.removeLast();
list.add(i, target);
}
}
/**
* 题目要求是列出字母顺序最小的
*/
public List<String> findItinerary2(String[][] tickets) {
HashMap<String, ArrayList<String>> map = new HashMap<>();
for (String[] ticket : tickets) {
map.computeIfAbsent(ticket[0], k -> new ArrayList<>()).add(ticket[1]);
}
for (List<String> list : map.values()) {
Collections.sort(list);
}
LinkedList<String> result = new LinkedList<>(Arrays.asList("JFK"));
dfs("JFK", map, result, tickets.length);
return result;
}
boolean dfs(String airport, HashMap<String, ArrayList<String>> map, LinkedList<String> route, int n) {
if (route.size() == n + 1) {
return true;
}
if (!map.containsKey(airport) || map.get(airport).isEmpty()) {
return false;
}
ArrayList<String> list = map.get(airport);
for (int i = 0; i < list.size(); i++) {
String target = list.remove(i);
route.add(target);
if (dfs(target, map, route, n)) {
return true;
}
route.removeLast();
list.add(i, target);
}
return false;
}
/**
* 欧拉递归解法如下
*/
public List<String> findItinerary3(String[][] tickets) {
for (String[] ticket : tickets)
targets.computeIfAbsent(ticket[0], k -> new PriorityQueue()).add(ticket[1]);
visit("JFK");
return route;
}
Map<String, PriorityQueue<String>> targets = new HashMap<>();
List<String> route = new LinkedList();
void visit(String airport) {
while (targets.containsKey(airport) && !targets.get(airport).isEmpty())
visit(targets.get(airport).poll());
route.add(0, airport);
}
/**
* 欧拉迭代写法
*/
public List<String> findItinerary4(String[][] tickets) {
for (String[] ticket : tickets)
targets.computeIfAbsent(ticket[0], k -> new PriorityQueue()).add(ticket[1]);
Map<String, PriorityQueue<String>> targets = new HashMap<>();
List<String> route = new LinkedList();
Stack<String> stack = new Stack<>();
stack.push("JFK");
while (!stack.isEmpty()) {
String s = stack.peek();
while (targets.containsKey(s) && !targets.get(s).isEmpty())
stack.push(targets.get(s).poll());
route.add(0, stack.pop());
}
return route;
}
}