题目
给你一份航线列表 tickets
,其中 tickets[i] = [fromi, toi]
表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK
(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK
开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
- 例如,行程
["JFK", "LGA"]
与["JFK", "LGB"]
相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例 1:
输入:tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]] 输出:["JFK","MUC","LHR","SFO","SJC"]
示例 2:
输入:tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]] 输出:["JFK","ATL","JFK","SFO","ATL","SFO"] 解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"] ,但是它字典排序更大更靠后。
提示:
1 <= tickets.length <= 300
tickets[i].length == 2
fromi.length == 3
toi.length == 3
fromi
和toi
由大写英文字母组成fromi != toi
思路
难点是如何选择容器
1.选择合适的容器
因为要去重且每个之间可能存在关系,所以可以用Map来存储
如Map<String,LinkedList<String>>
比如例二,JFK->SFO,ATL
2.但是问题又又又来了,题目让我们排序,上面的Map没排序,我们是要自己排序呢,还是......
3.对Map优化
根据这句话
行程 ["JFK", "LGA"]
与 ["JFK", "LGB"]
相比就更小,排序更靠前 ,得出要根据字典排序
别傻乎乎的手动排序啦,Java已经帮我们实现了,那就是PriorityQueue
即Map<String, PriorityQueue<String>>
代码
Map<String, PriorityQueue<String>> map = new HashMap<>();
LinkedList<String> ans = new LinkedList<>();
public List<String> findItinerary(List<List<String>> tickets) {
for (List<String> t : tickets) {
//t里面只有两个元素,题目说了
String from = t.get(0);
String to = t.get(1);
if (!map.containsKey(from)) {
map.put(from, new PriorityQueue<>());
}
map.get(from).add(to);
}
//一定是以JFK开头
dfs("JFK");
return ans;
}
private void dfs(String s) {
PriorityQueue<String> pq = map.get(jfk);
while (pq!=null&&!pq.isEmpty()) {
dfs(pq.poll());
}
//头插法,因为递归结束后,得到的是最后一个
ans.addFirst(s);
}