力扣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回溯 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 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 开始 如果存