class Solution {
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
}
};
332. 重新安排行程
给你一份航线列表 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
原站题解
golang 解法, 执行用时: 4 ms, 内存消耗: 5.8 MB, 提交时间: 2023-09-24 18:37:44
func findItinerary(tickets [][]string) []string { var ( m = map[string][]string{} res []string ) for _, ticket := range tickets { src, dst := ticket[0], ticket[1] m[src] = append(m[src], dst) } for key := range m { sort.Strings(m[key]) } var dfs func(curr string) dfs = func(curr string) { for { if v, ok := m[curr]; !ok || len(v) == 0 { break } tmp := m[curr][0] m[curr] = m[curr][1:] dfs(tmp) } res = append(res, curr) } dfs("JFK") for i := 0; i < len(res)/2; i++ { res[i], res[len(res) - 1 - i] = res[len(res) - 1 - i], res[i] } return res }
python3 解法, 执行用时: 48 ms, 内存消耗: 16.6 MB, 提交时间: 2023-09-24 18:37:30
class Solution: def findItinerary(self, tickets: List[List[str]]) -> List[str]: def dfs(curr: str): while vec[curr]: tmp = heapq.heappop(vec[curr]) dfs(tmp) stack.append(curr) vec = collections.defaultdict(list) for depart, arrive in tickets: vec[depart].append(arrive) for key in vec: heapq.heapify(vec[key]) stack = list() dfs("JFK") return stack[::-1]
java 解法, 执行用时: 6 ms, 内存消耗: 43.5 MB, 提交时间: 2023-09-24 18:37:19
class Solution { Map<String, PriorityQueue<String>> map = new HashMap<String, PriorityQueue<String>>(); List<String> itinerary = new LinkedList<String>(); public List<String> findItinerary(List<List<String>> tickets) { for (List<String> ticket : tickets) { String src = ticket.get(0), dst = ticket.get(1); if (!map.containsKey(src)) { map.put(src, new PriorityQueue<String>()); } map.get(src).offer(dst); } dfs("JFK"); Collections.reverse(itinerary); return itinerary; } public void dfs(String curr) { while (map.containsKey(curr) && map.get(curr).size() > 0) { String tmp = map.get(curr).poll(); dfs(tmp); } itinerary.add(curr); } }
cpp 解法, 执行用时: 40 ms, 内存消耗: 14.5 MB, 提交时间: 2023-09-24 18:37:07
class Solution { public: unordered_map<string, priority_queue<string, vector<string>, std::greater<string>>> vec; vector<string> stk; void dfs(const string& curr) { while (vec.count(curr) && vec[curr].size() > 0) { string tmp = vec[curr].top(); vec[curr].pop(); dfs(move(tmp)); } stk.emplace_back(curr); } vector<string> findItinerary(vector<vector<string>>& tickets) { for (auto& it : tickets) { vec[it[0]].emplace(it[1]); } dfs("JFK"); reverse(stk.begin(), stk.end()); return stk; } };