代码随想录:回溯19

news2024/11/23 15:26:18

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"]

示例 2:

输入:tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
输出:["JFK","ATL","JFK","SFO","ATL","SFO"]
解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"] ,但是它字典排序更大更靠后。

代码

class Solution {
    //用深度优先搜索:dfs+map+优先队列
    Map<String,PriorityQueue<String>> map = new HashMap<>();
    List<String> res = new LinkedList<>();
    public List<String> findItinerary(List<List<String>> tickets) {
        //把tickets转为map,key是出发点,value是所有到达点的优先队列(按字典升序)
        for(List<String> ticket : tickets){
            String from = ticket.get(0);  //出发点 
            String to = ticket.get(1);   //到达点
            //from不在map,new一个pq
            if(!map.containsKey(from)){
                PriorityQueue<String> pq = new PriorityQueue<>();
                map.put(from,pq);
            }
            //把到达点加入from的pq队列中
            map.get(from).add(to);
        }
        dfs("JFK");  //从JFK开始深度优先
        return res;
    }
    public void dfs(String from){
        PriorityQueue<String> pq = map.get(from);  //获取JFK的到达pq队列
        while(pq != null &&!pq.isEmpty()){ 
            String to = pq.poll();  //从优先队列中取首元素,字典序最小的,poll保证了所有机票只用一次
            dfs(to);  //从to继续深度优先
        }
        res.addFirst(from);  //把深度优先的元素一个个加到链表前面
    }
}

总结

        优先队列可以保证让我们找到字典序最小的路径。

        这道题用回溯操作嵌套的map,代码会很难写,而且容易超时,用深度优先+map+优先队列是最好理解的。以下图为例。

        map={ JFK,{ATL,SFO}, ATL,{JFK,SFO}, SFO,{ATL} }

        首先,从JFK开始获取到它的优先队列pq={ATL,SFO},ATL是队首元素,说明ATL是JFK的字典序最近到达点,因此路径JFK-ATL。此时JFK的pq={SFO}

        然后,从ATL开始获取它的优先队列pq={JFK,SFO},JFK是队首元素,说明JFK是ATL的字典序最近到达点,因此路径JFK-ATL-JFK。此时ATL的pq={SFO}

        然后,从JFK开始获取它的优先队列pq={SFO},SFO是队首元素,说明SFO是JFK的字典序最近到达点,因此路径JFK-ATL-JFK-SFO。此时JFK的pq={null}

        然后,从SFO开始获取它的优先队列pq={ATL},ATL是队首元素,说明ATL是STO的字典序最近到达点,因此路径JFK-ATL-JFK-SFO-ATL。此时SFO的pq={null}

        然后,从ATL开始获取它的优先队列pq={SFO},SFO是队首元素,说明SFO是ATL的字典序最近到达点,因此路径JFK-ATL-JFK-SFO-ATL-SFO。此时ATL的pq={null}

        然后,从SFO开始获取它的优先队列pq={},此时pq为空,路径结束。

        最后就是按DFS的顺序把每一个位置点加入链表,因为是深度优先搜索,所以最后递归到的ATL位置放在后边,最早递归到的JFK位置放在最前面。

        搞定!

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言面试题总结(含参考答案)------持续更新

1、关键字static的作用是什么&#xff1f; 在函数内部使用static修饰局部变量时&#xff0c;表示该变量在程序的整个生命周期内只会被初始化一次&#xff0c;并且在函数调用结束后不会被销毁&#xff0c;其值会一直保持。这种特性使得静态局部变量成为一种很有用的工具&#xf…

【ARM】MDK出现报错error: A\L3903U的解决方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK出现报错error: A\L3903U这样类型的报错 2、 问题场景 电脑或者软件因为意外情况导致崩溃&#xff0c;无法正常关闭&#xff0c;强制电脑重启之后&#xff0c;打开工程去编译出现下面的报错信息&#xff08;…

怎么把pdf格式文件其中几页单独弄出来

在现代办公和学习环境中&#xff0c;pdf格式的文件因其跨平台兼容性和良好的保持原样特性而备受欢迎。然而&#xff0c;有时我们可能只需要pdf文件中的某几页&#xff0c;而不是整个文件。这时&#xff0c;将PDF文件中的特定页面单独提取出来就显得尤为重要。 搜索一下&#xf…

React基础教程:TodoList案例

todoList案例——增加 定义状态 // 定义状态state {list: ["kevin", "book", "paul"]}利用ul遍历list数组 <ul>{this.state.list.map(item ><li style{{fontWeight: "bold", fontSize: "20px"}} key{item.i…

后端项目实战--瑞吉外卖项目软件说明书

瑞吉外卖项目软件说明书 一、项目概述 瑞吉外卖项目是一个外卖服务平台&#xff0c;用户可以通过该平台浏览餐厅菜单、下单、支付以及追踪订单状态。产品原型就是一款产品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品得初步构思有一…

Linux ldd和ldconfig

ldconfig ldconfig 查看默认库路径和ld.so.conf包含的库路径&#xff0c;来建立运行时动态装载的库查找路径。 ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),…

推挽式B类功率放大器的基本原理

单晶体管 B 类放大器&#xff08;图 1&#xff09;使用高 Q 值储能电路作为负载来抑制高次谐波分量。通过采用高 Q 谐振电路&#xff0c;输出电压仅包含基波分量&#xff0c;使放大器能够忠实地再现输入信号。尽管集电极电流是半波整流正弦波&#xff0c;但高 Q 值储能电路将谐…

11_1、多态性:概念及运算符重载

多态性 多态的概念和类型多态的类型多态的实现 运算符重载运算符重载的概念和规则概念规则 运算符重载为类的成员函数双目运算符单目运算符 运算符重载为类的友元函数双目运算符重载单目运算符重载 多态的概念和类型 消息&#xff1a;消息在C编程中指的是对类的成员函数的调用…

【C++进阶】模板与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…

深度学习之激活函数

激活函数&#xff08;Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模式。在神经元中&#xff0c;输入的input经过一系列加权求和后作用于另一个函数&#xff0c;这个函数就是这里的激活函数。 1. 为什么需要激活…

在Oxygen中如何打开文件管理器并显示文件所在目录

▲ 搜索“大龙谈智能内容”关注公众号▲ 在Oxygen中&#xff0c;我们常需要查看项目中的某文件在Windows“文件资源管理器”所在位置&#xff0c;从而进行拷贝、分享等各种操作。 通过以下方法可以实现&#xff1a; 1. 在Oxygen的“项目”中选择文件并单击右键 2. 选择菜单…

数据可视化后起之秀——pyecharts

题目一&#xff1a;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额 题目描述&#xff1a; 编写程序。根据第9.3.1&#xff0c;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额。 运行代码&#xff1a; #绘制折线图&#xff0c;展示商家A与商家B各类饮品的…

【区块链】解码拜占庭将军问题:区块链共识机制的哲学基石

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 解码拜占庭将军问题&#xff1a;区块链共识机制的哲学基石引言一、拜占庭将军问…

ComfyUI 快速搭建流程

相关地址 ComfyUIPytorch版本 环境准备 nvidia 3090 ----------------------------------------------------------------------------- | NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 | |--------------------------------------------…

码垛机性能的关键因素及优化策略

在工业自动化领域&#xff0c;码垛机以其高效、准确的特点&#xff0c;成为现代生产线上的得力助手。然而&#xff0c;要想充分发挥码垛机的性能优势&#xff0c;就必须深入了解影响其性能的关键因素&#xff0c;并针对性地制定优化策略。星派将为您详细解析码垛机性能的关键影…

数据仓库与数据挖掘实验练习题

练习题2 1. 使用超级英雄列表来填充一个新的 Series 对象。 2. 使用力量元组来填充一个新的 Series 对象。 3. 创建一个 Series&#xff0c;将超级英雄作为索引标签&#xff0c;力量等级作为值。将这个 Series 赋值给 heroes 变量。 4. 提取 heroes Series 的前两行。 5. 提取 …

程序员必备的职业素养:专业精神、沟通能力与持续学习

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 专业精神&#xff1a;技术的执着追求 沟通能力&#xff1a;团队合作的桥梁 持续学习&#xff1a;不断进步的动力 结语 我的…

世优科技AI数字人多模态交互系统“世优波塔”正式发布

2024年6月6日&#xff0c;世优科技“波塔发布会”在北京举办&#xff0c;本次发布会上&#xff0c;世优科技以全新的“波塔”产品诠释了更高效、更智能、更全面的AI数字人产品及软硬件全场景解决方案&#xff0c;实现了世优品牌、产品和价值的全面跃迁。来自行业协会、数字产业…

商用车CAN数据数字化是促进生态环保高质量发展的桥梁纽带

在当今这个智能化、电动化、信息化、数字化快速发展的时代&#xff0c;其中数字化转型已经成为各行各业提升效率、优化管理的关键途径&#xff0c;21世纪这个被誉为“大数据时代”的纪元&#xff0c;数据的潜力、生产力、作为基础设施被无限放大&#xff0c;其在各个领域&#…

6-1RT-Thread事件集

6-1RT-Thread事件集 其中&#xff0c;一对多方式比较常见。一对多方式其线程与时间的关系又可分为特定时间触发唤醒线程&#xff0c;类似于逻辑非控制电路&#xff0c;灯泡亮灭&#xff0c;由一个开关就可以触发。 事件集中&#xff0c;任意事件触发唤醒线程类似于逻辑或控制电…