LeetCode-重新安排行程(C++)
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”]
解题思路:
本题使用回溯算法。
一个机场对应多个机场,可以使用unordered_map,然后多个机场需要有个先后顺序,可以使用map<string,int>,第二个值用来记录到达机场的次数。次数大于0,说明目的地还可以飞。
定义全局变量unordered_map<string, map<string, int>> targets,将一个机场和多个机场的映射记录下来。首先将JFK加入结果集result。
回溯三部曲
- 确定回溯函数参数和返回值:需要传入机票数量和结果集,返回类型为bool类型,因为只有唯一一条路径,其他路径返回false。
- 确定终止条件:如果结果集里的元素个数等于机票数量加1,就说明找到了唯一的一条路径,返回true。
- 确定单层回溯逻辑:将结果集最后一个元素作为targets的key值,遍历对应的value值(可能有多个,因为一个机场对应多个机场),然后看目的机场的次数是否大于0(目的机场已排好序,所以结果符合按字典排序返回最小的行程组合要求),大于说明可以到达目的机场,将目的机场加入结果集,目的机场次数减1,然后往下一层递归。接下来回溯,结果集弹出最后一个元素,目的机场加1。
代码:
class Solution { //332. 重新安排行程
public:unordered_map<string, map<string, int>> targets;bool backtracking(int ticketNum, vector<string>& result) {if (result.size() == ticketNum + 1) return true;for (pair<const string,int>& target:targets[result[result.size() - 1]]) {if (target.second > 0) {result.push_back(target.first);target.second--;if (backtracking(ticketNum, result)) return true;result.pop_back();target.second++;}}return false;}vector<string> findItinerary(vector<vector<string>>& tickets) {targets.clear();vector<string> result;for (const vector<string>& vec : tickets) {targets[vec[0]][vec[1]]++;}result.push_back("JFK");backtracking(tickets.size(), result);return result;}
};int main() {vector<vector<string>> tickets = { { "JFK", "SFO" }, { "JFK", "ATL" }, { "SFO", "ATL" }, { "ATL", "JFK" }, { "ATL", "SFO" } };Solution s;vector<string> result = s.findItinerary(tickets);return 0;
}
参考资料:
代码随想录
LeetCode-重新安排行程(C++)相关推荐
- 「leetcode」332.重新安排行程【回溯算法/深搜】详细图解!
本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...
- 【LeetCode】332. 重新安排行程
[LeetCode]332. 重新安排行程 前言 最近在刷回溯专题的题目,前几种题型(排列.组合.子集.子序列)如果直接套用模板,加一些剪枝,随便过的那种 但是这一题如果带入普通的回溯模板,可能无从下 ...
- LeetCode刷题流程:回溯算法-13.332. 重新安排行程
332. 重新安排行程 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从 JFK(肯尼迪国际机 ...
- 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独 这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...
- LeetCode:安排工作以达到最大收益【455】
LeetCode:安排工作以达到最大收益[455] 题目描述 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[ ...
- 代码随想录30——回溯:332重新安排行程、51N皇后、37解数独
文章目录 1.332重新安排行程 1.1.题目 1.2.解答 1.2.1.思路 1.2.2.代码 2.51N皇后 2.1.题目 2.2.解答 3.37解数独 3.1.题目 3.2.解答 3.2.1.正 ...
- 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独
一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...
- 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结
代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...
- 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独
代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...
- 代码随想录算法训练营第三十天| 第七章 回溯算法:332.重新安排行程,51.N皇后,37.解数独(python)
回溯算法总结 332.重新安排行程 讲解链接 class Solution:def __init__(self):self.res = []self.dict = defaultdict(list)d ...
最新文章
- 网站文章要求图文并茂,图片要怎样做好优化工作呢?
- 图像处理(四)图像分割(2)测地距离Geodesic图割
- 小明分享:Esp32下softAP+tcp_server的简单实现
- 重定向与跳转的区别 .
- python基础小白题3
- Speed Up YUM!
- 阿里云的技术创新,不是简单的路线之争
- 《数学之美》—有限状态机和动态规划
- 35岁,程序员过不去的坎?
- mac安装JDK及maven
- 数字推理题的解题技巧
- MSSQL 负载均衡(Moebius)
- html js满屏飘雪特效,原生js实现的雪花飘落特效
- 【影视系列】《乘风破浪》
- matlab的上机报告,数理统计和Matlab上机报告.doc
- 醋泡三宝可以吃出长寿
- 主流的6个Go语言Web框架
- Android 新技术
- 即将上市的三星Note8竟然拥有一般手机没有的这几个功能,你知道吗?
- 常见的几种短信应用场景
热门文章
- 机器学习5-线性回归算法的代码实现
- #标题 已知从键盘上任意输入一个3位整数,编译计算并输出它的逆序数
- 创意编程-创意自画像
- “祖尔谈软件”——过时的悲叹?
- 华为交换机SSH 创建管理账号密码
- [数据集][目标检测]公路落石和滑坡数据集VOC格式-991张
- Win10进入安全模式
- python浮点数的范围和精度_python基础教程之C#教程之C#中float的取值范围和精度分析...
- 关于SpringMVC框架实现简单的文件上传下载(ssm)
- “十四五”开局丨数字经济的技术底座呈现哪些新特征?