题目

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。
提示:
如果存在多种有效的行程,请你按字符自然排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前
所有的机场都用三个大写字母表示(机场代码)。
假定所有机票至少存在一种合理的行程。
所有的机票必须都用一次 且 只能用一次。
示例 1:
输入:[[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]]
输出:[“JFK”, “MUC”, “LHR”, “SFO”, “SJC”]
示例 2:
输入:[[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出:[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释:另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”]。但是它自然排序更大更靠后

思路

回溯三部曲:

  1. 递归函数参数:

  2. 终止条件: 比如输入有四个航班,只需要找出一种行程,里面机场个数是5就可以了,即在回溯遍历的过程中,遇到的机场个数如果达到了(航班个数+1),就找到了一个行程把所有的航班串在一起了

if(result.size() == ticketNum +1){return true;
}
  1. 单层搜索逻辑:需要找一个对数据进行排序的容器,而且还要容易增删元素

java代码如下:

class Solution {LinkedList<String> res;LinkedList<String> path = new LinkedList<>();public LinkedList<String> findItinerary(List<List<String>> tickets){Collection.sort(tickets,(a,b) -> a.get(1).compareTo(b.get(1)));//Collections.sort(names, (a, b) -> b.compareTo(a));对字符串进行排序path.add("JKF");boolean[] used = new boolean[tickets.size()];//标记数组去判断是否机场使用过dfs((ArrayList) tickets, used);return res;}public boolean dfs(ArrayList<List<String>> tickets, boolean[] used){if(path.size() == tickets.size() + 1){res = new LinkedList<>(path);return true;}for(int i = 0; i < tickets.size(); i++){if(!used[i] && tickets.get(i).get(0).equals(path.getLast())){//如果前后机场信息相同但是没有使用过的话,则加入path数组path.add(tickets.get(i).get(1));//把该机场加入path,因为tickets是二维数组,第一次get的是第一个数组,第二次get的才是机场的信息    used[i] = true;//标记成已经使用过if(dfs(tickets, used)){return true;}used[i] = false;path.removeLast();}}return false;}
}

代码随想录回溯算法——重新安排行程相关推荐

  1. 代码随想录——回溯算法

    目录 一.回溯法理论基础 二.组合问题 三.子集问题 四.分割问题 五.排列问题 六.行程问题 七.棋盘问题 一.回溯法理论基础 回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历 ...

  2. 力扣算法刷题Day30|回溯:重新安排行程 N皇后 解数独

    力扣题目:#332.重新安排行程 刷题时长:参考题解 解题方法:回溯法 + 哈希表 复杂度分析 时间 空间 问题总结 无思路 本题收获 难点 避免死循环:去过的to机场及时删除 记录映射关系:哈希表, ...

  3. 代码随想录贪心算法——买卖股票的最佳时机含手续费

    题目 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付手续费.如果你已经购买 ...

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

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

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

  6. 代码随想录【Day 30】| 332.重新安排行程 、51. N皇后 、37. 解数独

    代码随想录[Day 30] | 332.重新安排行程 .51. N皇后 .37. 解数独 332.重新安排行程 题目链接:332.重新安排行程 卡尔文解 解题思路及注意事项: 代码实现: 51. N皇 ...

  7. 代码随想录算法公开课!

    关注代码随想录的录友,基本都是跟着代码随想录一起刷题的. 目前代码随想录的内容是完全开放在代码随想录网站,Github,和Gitee上,同时也出版了<代码随想录>纸质版. 这套刷题顺序和题 ...

  8. Leetcode刷题笔记(代码随想录)

    1 数组 1.1 二分查找 第一种写法:我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] .区间的定义这就决定了二分法的代码应该如何写,因为定义target在[le ...

  9. 【回溯算法】LeetCode的1024活动快速合成1024硬币攻略

    游戏规则 用 7 张牌进行 3 次运算,其中每次运算需使用 2 张 数字牌 和 1 张 运算符号牌 : 每次运算后都将根据上一次的运算结果生成一张数字牌.最后一次运算结果刚好等于 1024 时记为「成 ...

最新文章

  1. js 排列 组合 的一个简单例子
  2. 输入10个数,根据提示进行从小到大输出或从大到小输出
  3. 贪吃蛇程序 php,php Web程序 - 贪吃蛇学院-专业IT技术平台
  4. 退货表mysql_openant电商-退货 - 数据库设计 - 数据库表结构 - 果创云
  5. 前端学习(1424):ajax低版本兼容问题
  6. linux删除文件夹命令6,Linux下创建、删除文件和文件夹命令
  7. oracle从光盘启动不了,oracle install
  8. html5+css3第一次作业_在家写作业日记200字
  9. 现在流行「毕业式」裁员吗?
  10. cuda对应pytorh安装
  11. 软件需求分析用例图 实例简述
  12. java读取配置文件路径问题
  13. 任正非亲自参与,2021数字化转型再造华为!
  14. 走进音视频的世界——剖析exo播放器架构
  15. 双麦定向拾音束回音消除及远场拾音降噪模块 A-68测试1-(原理篇)
  16. Zabbix5.0 添加监控深信服AC接口流量
  17. 建设银行 企业公帐 操作思路
  18. swagger、knif4j访问不了
  19. 2021年茶艺师(中级)考试报名及茶艺师(中级)考试试卷
  20. hbase_数据备份(导入/导出)

热门文章

  1. Cocos图片加密与解密
  2. 【电脑使用】介绍几种安装Windows系统的方法及一些个人理解
  3. 适用于Apple Watch的Game Boy模拟器,RPG Maker进入Linux,以及更多游戏新闻
  4. 个人掌上游戏机的diy——之一,介绍
  5. 防止微机室教师机对学生机的控制
  6. 化工企业MES解决方案
  7. 平安金融壹账通正筹备赴美上市,已将区块链落地到5个行业
  8. 英语教学 计算机专业 高校,[高校计算机辅助普通话水平测试下的教学新模式]《计算机专业英语》pdf...
  9. Java面向对象程序基础设计之第三章
  10. 小米手机通用卡刷线刷解锁BL注意事项ROOT权限获取刷机教程总结