力扣332. 重新安排行程 Java dfs回溯

2023-11-10

给你一份航线列表 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

解题思路:
思路1:用HashMap<String, TreeSet> 存储tickets key表示出发地点 TreeSet表示终点 并且TreeSet自动会按字典进行排序 因为每次遍历直接取的是最佳路线 所以直接取TreeSet中的第一个即可

思路1错了 按照思路1的话每次可以选择多个终点的时候 如果只默认选第一个 有可能进入的地方没有可以去的下一个地方
思路2:
所以应该每次有多个可以去的地方的时候 要用递归每个地方都尝试一下 然后如果下个地方没有机票 就中断递归
然后当所有递归完成了 可能有多个结果 因为我们用的是TreeSet 所以肯定默认选最优的那个
所以当找到了结果的时候直接终止递归返回这个结果就行 另外因为java对对象的参数传递是引用传递
所以递归的时候需要不断回溯我们的HashMap<String,TreeSet>

思路2错了 TreeSet不能保存重复值 [[“JFK”,“SFO”],[“JFK”,“SFO”],[“SFO”,“JFK”]]用例失败
思路3(通过):
应该用HashMap<String, TreeMap<String,Integer>> 这样即可以排序String 也可以记录同一个机票的剩余票数

public static void dfs(List<String> sum, Boolean[] haveFind, String startStation, HashMap<String, TreeMap<String, Integer>> map, int sumStation, int nowStation) {
    if (nowStation == sumStation) {// 已经找到结果了 并且第一个找到的就是最佳结果 结束所有递归
        haveFind[0] = true;
        return;
    }
    if (map.get(startStation) == null) return;//找不到始发站为startStation的票 这个递归失败

    TreeMap<String, Integer> treeMap = map.get(startStation);
    TreeSet<String> ss = new TreeSet<>(treeMap.keySet());//new一个keySet来遍历treeMap 防止遍历时因为修改treeMap报错
    for (String s : ss) {//遍历所有剩余的始发站为startStation的票
        sum.add(s);
        Integer left = treeMap.get(s) - 1;//表示这个出发和目的地相同的机票还有几张
        if (left == 0) treeMap.remove(s);
        else treeMap.put(s, left);
        map.put(startStation, treeMap);
        dfs(sum, haveFind, s, map, sumStation, nowStation + 1);

        if (haveFind[0]) return;//已经找到结果了 不用递归了

        //回溯
        sum.remove(sum.size() - 1);
        treeMap.put(s, left + 1);
        map.put(startStation, treeMap);
    }
}

public static List<String> findItinerary(List<List<String>> tickets) {
    HashMap<String, TreeMap<String, Integer>> map = new HashMap<>();
    for (List<String> ticket : tickets) {
        if (map.containsKey(ticket.get(0))) {
            TreeMap<String, Integer> treeMap = map.get(ticket.get(0));
            if (treeMap.containsKey(ticket.get(1))) treeMap.put(ticket.get(1), treeMap.get(ticket.get(1)) + 1);
            else treeMap.put(ticket.get(1), 1);
            map.put(ticket.get(0), treeMap);
        } else {
            TreeMap<String, Integer> treeMap = new TreeMap<>();
            treeMap.put(ticket.get(1), 1);
            map.put(ticket.get(0), treeMap);
        }
    }
    List<String> sum = new ArrayList<>();
    sum.add("JFK");
    Boolean[] haveFind = new Boolean[1];
    haveFind[0] = false;
    dfs(sum, haveFind, "JFK", map, tickets.size(), 0);
    return sum;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣332. 重新安排行程 Java dfs回溯 的相关文章

随机推荐

  • Chapter 12 贝叶斯网络

    1 概率公式 条件概率 全概率公式 贝叶斯公式 Bayes 2 贝叶斯公式 2 1 贝叶斯公式带来的思考 给定某些样本 在这些样本中计算某结论出现的概率 即 贝叶斯公式 样本给定 则对于任何是常数 仅为归一化因子 忽略 若这些结论的先验概率
  • 在 Windows 操作系统上安装和配置

    1 下载安装包以获取最新版本 stable 的 Flutter SDK https storage flutter io cn flutter infra releases stable windows flutter windows 1
  • Pycharm修改python解释器

    Pycharm修改python解释器 在python学习过程中 遇到了这样的一个问题 早先通过pip安装的库在pycharm中无法使用 例如之前学习的numpy库在pycharm中无法调用 下面给出两个解决办法 1 通过pycharm自带的
  • 还在为不知道怎么学习网络安全而烦恼吗?这篇文带你从入门级开始学习网络安全—认识网络安全

    随着网络安全被列为国家安全战略的一部分 这个曾经细分的领域发展提速了不少 除了一些传统安全厂商以外 一些互联网大厂也都纷纷加码了在这一块的投入 随之而来的吸引了越来越多的新鲜血液不断涌入 不同于Java C C 等后端开发岗位有非常明晰的学
  • [转]笔试面试中问到的常见问题总结

    面试的三大重点 第一个是项目 项目这个应该挺好说的 只要自己有这方面的准备 第二个是数据结构和算法 这个无论在笔试还是在面试中都很重要 第三个如果面C 方向的话 C 基础很重要 接下来谈一下后二者各自的一些常见问题 一 数据结构和算法 链表
  • 基于Matlab的图像加噪滤波处理和图像边缘检测

    目录 1 1 原始图像展示 1 2 灰度图展示 1 3 高斯加噪图展示 1 4 均值滤波图展示 1 5 中值滤波图展示 1 6 高斯滤波图展示 对比三种滤波效果 2 1 Sobel边缘检测图展示 2 2 Canny边缘检测图展示 对比两种边
  • JAVA8 十大新特性浅谈

    本教程将Java8的新特新逐一列出 并将使用简单的代码示例来指导你如何使用默认接口方法 lambda表达式 方法引用以及多重Annotation 之后你将会学到最新的API上的改进 比如流 函数式接口 Map以及全新的日期API Java
  • matlab中plot函数用法

    线条 颜色等参数 1 简单的2维直线图 plot x y 同一坐标显示n条线 plot x y1 x y2 x 0 pi 10 2 pi y sin x figure hold on plot x y 2 plot X X是矩阵 表示矩阵的
  • 导入Excel文件的各种常见方法

    1 为了简单起见 可以考虑将包括扩展名为xls xlsx的各种Excel文件在Excel WPS表格中另存为CSV格式 更为方便和易于读取 直接使用pandas的read csv方法即可读取 如另存为 读取方法为 2 直接读取Excel文件
  • 在 QSS 中设置 Qt Widget 属性

    在 QSS 中设置 Qt Widget 属性 默认样式 QSS 自定义属性与 Qt 类型对应 使用枚举 使用 QSS 属性选择器 代码实例 在 QSS 中设置 Qt Widget 属性 Q OBJECT 添加自定义属性到 Qt动态属性系统
  • 使用maven模板快速生成项目

    1 Archetype介绍 Archetype是一个Maven项目的模板工具包 它定义了一类项目的基本架构 Archetype为开发人员提供了创建Maven项目的模板 同时它也可以根据已有的Maven项目生成参数化的模板 通过archety
  • Linux/Mac go版本升级

    文章目录 背景 卸载当前版本 安装最新版本 解压下载的文件 验证生效 背景 Mac上go版本为1 10 在1 11以后加入了go mod等特性 所以要更新到最新的go版本 此方法适用于Mac Linux 卸载当前版本 只需要删除 usr l
  • STM32F103C8T6使用备忘录

    1 STM32端口配置寄存器 CRH寄存器 用于高位I O口 即GPIOX8 GPIOX15 X可以是A B C D E等 每个IO口有两个寄存器 分别是CNFxx 1 0 和MODExx 1 0 共占四位二进制or一位十六进制 1 CNF
  • Nginx下开启php-fpm的错误提示

    Nginx下开启php fpm的错误提示 1 php fpm的作用 nginx本身不能处理PHP 它只是个web服务器 当接收到请求后 如果是php请求 则发给php解释器处理 并把结果返回给客户端 nginx一般是把请求发fastcgi管
  • hausdorff matlab,matlab练习程序(Hausdorff距离)

    Hausdorff距离是根据Hausdorff 1868 1942 命名的 Hausdorff距离是指某一集合中离另一集合最近点的所有距离的最大值 通常用如下公式表示 需要注意的是h A B 和h B A 通常不相等 所以可以定义更一般的H
  • React Context源码是怎么实现的呢

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api 大多数项目不会直接使用 createContext 然后向下面传递数据 而是采用第三方库 react redux 想想项目中是不是经常会用到 connect Com
  • 什么是数据湖技术数据湖和数据仓库的区别(好文转载)

    原文链接 什么是数据湖技术 xuzhujack 博客园 什么是数据湖 有什么用 终于有人讲明白了 大数据 CSDN博客 数据湖 Data Lake 是Pentaho公司创始人及CTO James Dixon于2010年10月在2010年10
  • Verilog文件的读取(fscanf)和写入(fwrite)方法

    在写testbench时 经常会用到文件的读取 下面示例了文件读取和写入的方法 文件读取 图中第一行定义一个文件句柄 由于打开的文件中一行中有两个10bit的十进制数据 所以定义了2个reg变量 第6行到12行就是文件的读取过程 使用的系统
  • 一个恋爱小故事告诉你什么是gRPC?!

    RPC 对RPC不了解的人 或许会纠结其与TCP HTTP等的关系 后者是网络传输中的协议 而RPC是一种设计 实现框架 通讯协议只是其中一部分 RPC不仅要解决协议通讯的问题 还有序列化与反序列化 以及消息通知 一个完整的RPC架构里面包
  • 力扣332. 重新安排行程 Java dfs回溯

    给你一份航线列表 tickets 其中 tickets i fromi toi 表示飞机出发和降落的机场地点 请你对该行程进行重新规划排序 所有这些机票都属于一个从 JFK 肯尼迪国际机场 出发的先生 所以该行程必须从 JFK 开始 如果存