试用网站源码,新闻类软文营销案例,天津室内设计学校,wordpress 收费 主题力扣日记#xff1a;【回溯算法篇】332. 重新安排行程 日期#xff1a;2023.3.3 参考#xff1a;代码随想录、力扣 ps#xff1a;因为是困难题#xff0c;望而却步了一星期。。。T^T 332. 重新安排行程
题目描述 难度#xff1a;困难 给你一份航线列表 tickets #xf…力扣日记【回溯算法篇】332. 重新安排行程 日期2023.3.3 参考代码随想录、力扣 ps因为是困难题望而却步了一星期。。。T^T 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 300tickets[i].length 2from_i.length 3to_i.length 3from_i 和 to_i 由大写英文字母组成from_i ! to_i
题解
cpp ver
class Solution {
public:// 关键1使用 unordered_map targets string, mapstring, int 记录各段航线(起点, 终点, 航线次数)// 一个起点机场可能映射多个终点所以用unordered_map// 且相同起点的不同航线之间按字典顺序排即终点机场按字母序排列按照这种顺序进行遍历得到的行程即满足题目要求的最小行程所以用map其中航线次数记录剩余次数为1则表示该航线未走为有效vectorstring findItinerary(vectorvectorstring tickets) {// 初始化targetsunordered_mapstring, mapstring, int targets;for (const vectorstring vec : tickets) {targets[vec[0]][vec[1]]; // 记录映射关系 vec(即vectorstring)中包含两个机场第一个str为起点第二个为终点}// 初始化pathvectorstring path;path.push_back(JFK); // 第一个机场一定是JFKbacktracking(tickets.size(), targets, path);return path;}// 返回值与参数由于只需要一条有效行程所以当成功收集时通过返回true来终止各层递归// 参数为记录tickets中的航线数量的ticketNum记录各段航线的targets(相当于总集合)// 以及记录最小有效行程的path(由于只需要一条有效行程所以不需要results收集path)这些参数也可以都作为全局变量bool backtracking(int ticketNum, unordered_mapstring, mapstring, int targets, vectorstring path) {// 终止条件当path中的机场个数为航线数1时说明全部航线已走完if (path.size() ticketNum 1) {return true; // 注意这里是返回true且不再需要results收集path}// for循环// 关键2在树状结构中某一节点的横向遍历表示以当前所在机场为起点遍历选取对应目的机场一个机场对应0或多个目的机场// 当前所在机场即path中最后一个机场即path[path.size()-1]而targets[起点机场]则记录了以该机场为起点的对应终点for (pairconst string, int target : targets[path[path.size() - 1]]) { // 遍历各个机场终点终点航线次数// 注意这里target一定要加才能修改到targets中的航线次数// 而加上引用之后就必须在 string 前面加上 const因为map中的key 是不可修改的语法规定// 只有当前航线次数0表示此航线存在且未走过才能选取防止重复走if (target.second 0) {path.push_back(target.first); // 存储该机场target.second--; // 航线次数-1// 递归关键3通过返回值判断是否提前结束if (backtracking(ticketNum, targets, path)) return true;// 如果走了错误的路即遍历到没有对应终点了也没有达到终止条件则回溯target.second;path.pop_back();}}return false;}
};复杂度
时间复杂度 空间复杂度
思路总结
见注释思路来源于代码随想录