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。

回溯三部曲

  1. 确定回溯函数参数和返回值:需要传入机票数量和结果集,返回类型为bool类型,因为只有唯一一条路径,其他路径返回false。
  2. 确定终止条件:如果结果集里的元素个数等于机票数量加1,就说明找到了唯一的一条路径,返回true。
  3. 确定单层回溯逻辑:将结果集最后一个元素作为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++)相关推荐

  1. 「leetcode」332.重新安排行程【回溯算法/深搜】详细图解!

    本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...

  2. 【LeetCode】332. 重新安排行程

    [LeetCode]332. 重新安排行程 前言 最近在刷回溯专题的题目,前几种题型(排列.组合.子集.子序列)如果直接套用模板,加一些剪枝,随便过的那种 但是这一题如果带入普通的回溯模板,可能无从下 ...

  3. LeetCode刷题流程:回溯算法-13.332. 重新安排行程

    332. 重新安排行程 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从 JFK(肯尼迪国际机 ...

  4. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

  5. LeetCode:安排工作以达到最大收益【455】

    LeetCode:安排工作以达到最大收益[455] 题目描述 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[ ...

  6. 代码随想录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.正 ...

  7. 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独

    一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...

  8. 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结

    代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...

  9. 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

    代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...

  10. 代码随想录算法训练营第三十天| 第七章 回溯算法:332.重新安排行程,51.N皇后,37.解数独(python)

    回溯算法总结 332.重新安排行程 讲解链接 class Solution:def __init__(self):self.res = []self.dict = defaultdict(list)d ...

最新文章

  1. 网站文章要求图文并茂,图片要怎样做好优化工作呢?
  2. 图像处理(四)图像分割(2)测地距离Geodesic图割
  3. 小明分享:Esp32下softAP+tcp_server的简单实现
  4. 重定向与跳转的区别 .
  5. python基础小白题3
  6. Speed Up YUM!
  7. 阿里云的技术创新,不是简单的路线之争
  8. 《数学之美》—有限状态机和动态规划
  9. 35岁,程序员过不去的坎?
  10. mac安装JDK及maven
  11. 数字推理题的解题技巧
  12. MSSQL 负载均衡(Moebius)
  13. html js满屏飘雪特效,原生js实现的雪花飘落特效
  14. 【影视系列】《乘风破浪》
  15. matlab的上机报告,数理统计和Matlab上机报告.doc
  16. 醋泡三宝可以吃出长寿
  17. 主流的6个Go语言Web框架
  18. Android 新技术
  19. 即将上市的三星Note8竟然拥有一般手机没有的这几个功能,你知道吗?
  20. 常见的几种短信应用场景

热门文章

  1. 机器学习5-线性回归算法的代码实现
  2. #标题 已知从键盘上任意输入一个3位整数,编译计算并输出它的逆序数
  3. 创意编程-创意自画像
  4. “祖尔谈软件”——过时的悲叹?
  5. 华为交换机SSH 创建管理账号密码
  6. [数据集][目标检测]公路落石和滑坡数据集VOC格式-991张
  7. Win10进入安全模式
  8. python浮点数的范围和精度_python基础教程之C#教程之C#中float的取值范围和精度分析...
  9. 关于SpringMVC框架实现简单的文件上传下载(ssm)
  10. “十四五”开局丨数字经济的技术底座呈现哪些新特征?