刷题顺序按照代码随想录建议
题目描述
英文版描述
You are given a list of airline tickets
where tickets[i] = [from(i), to(i)]
represent the departure and the arrival airports of one flight. Reconstruct the itinerary in order and return it.
All of the tickets belong to a man who departs from "JFK"
, thus, the itinerary must begin with "JFK"
. If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string.
- For example, the itinerary
["JFK", "LGA"]
has a smaller lexical order than["JFK", "LGB"]
.
You may assume all tickets form at least one valid itinerary. You must use all the tickets once and only once.
Example 1:
Input: tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]] Output: ["JFK","MUC","LHR","SFO","SJC"]
Example 2:
Input: tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]] Output: ["JFK","ATL","JFK","SFO","ATL","SFO"] Explanation: Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"] but it is larger in lexical order.
Constraints:
1 <= tickets.length <= 300
tickets[i].length == 2
from(i).length == 3
to(i).length == 3
from(i)
andto(i)
consist of uppercase English letters.from(i) != to(i)
英文版地址
中文版描述
给你一份航线列表 tickets
,其中 tickets[i] = [from(i), to(i)]
表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 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
from(i).length == 3
to(i).length == 3
from(i)
和to(i)
由大写英文字母组成from(i) != to(i)
中文版地址
解题方法
递归法
Java
class Solution {
List<String> result = new ArrayList<>();
Map<String, TreeMap<String, Integer>> map = new HashMap<>();
public List<String> findItinerary(List<List<String>> tickets) {
// 初始化map
for (List<String> ticket : tickets) {
String from = ticket.get(0);
String end = ticket.get(1);
map.putIfAbsent(from, new TreeMap<>());
TreeMap<String, Integer> fromTreeMap = map.get(from);
fromTreeMap.put(end, fromTreeMap.getOrDefault(end, 0) + 1);
}
result.add("JFK");
boolean flag = backTrack(tickets, 0);
return result;
}
private boolean backTrack(List<List<String>> tickets, int count) {
if (result.size() == tickets.size() + 1) {
return true;
}
String from = result.get(result.size() - 1);
TreeMap<String, Integer> stringIntegerTreeMap = map.get(from);
if(stringIntegerTreeMap == null){
return false;
}
for (String ss : stringIntegerTreeMap.keySet()) {
Integer mm = stringIntegerTreeMap.get(ss);
if (mm > 0) {
result.add(ss);
map.get(from).put(ss, stringIntegerTreeMap.get(ss) - 1);
boolean b = backTrack(tickets, count + 1);
if (b) {
return true;
}
result.remove(result.size() - 1);
map.get(from).put(ss, stringIntegerTreeMap.get(ss) + 1);
}
}
return false;
}
}
复杂度分析
- 时间复杂度:不会啊不会啊= =// >> 回溯算法的时间复杂度,搞不懂啊(q求大神指点=[,,_,,]:3)
- 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)