【LeetCode】332. 重新安排行程(困难)——代码随想录算法训练营Day30

题目链接: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"] ,但是它字典排序更大更靠后。

提示:

  • 1 <= tickets.length <= 300
  • tickets[i].length == 2
  • fromi.length == 3
  • toi.length == 3
  • fromi 和 toi 由大写英文字母组成
  • fromi != toi

文章讲解:代码随想录

题解1:回溯法

思路:本题考虑到对有向图进行深度优先搜索得出答案,同时涉及到车票数量的问题,可以考虑使用回溯法。首先构建一个出发地、目的地和车票数量之间的映射,使用 Map<String, Map<String, int>> 的结构,即 Map<出发地, Map<目的地, 车票数量>>。然后从第1个出发地开始,深度优先遍历目的地,在对车票进行排序后,第一个找出的结果即为本题答案。

回溯分析:

  • 递归函数的参数和返回值:首先创建变量 res 和 path,res 用于存放结果,path 为路径。参数为空,返回一个布尔值,如果找到结果,就返回 true,否则返回 false。
  • 递归函数的终止条件:找到一个符合要求的结果,即路径的长度为车票总数量加1。
  • 单层递归的逻辑:以路径最后一个位置为出发地,横向遍历所有目的地,继续纵向向下遍历。
  • 剪枝:当出发地与一个目的地之间车票数量为0,则说明这个树枝没有结果,跳过这次遍历。
/*** @param {string[][]} tickets* @return {string[]}*/
var findItinerary = function(tickets) {tickets.sort(); // 对车票排序// 构建映射关系,出发地: { 目的地: 车票数量 }const map = {};tickets.forEach(item => {map[item[0]] ? (map[item[0]][item[1]] ? map[item[0]][item[1]]++ : map[item[0]][item[1]] = 1) : map[item[0]] = { [item[1]]: 1 };});let res = []; // 保存结果const path = ["JFK"]; // 路径const backtracking = function () {// 路径长度等于车票数量加1,说明收集到了1个结果,因为原数组已排序,第1个结果就是本题的结果if (path.length === tickets.length + 1) {res = [...path]; // 记录到结果中return true; // 找到符合条件的路径,返回 true}const arr = map[path[path.length - 1]]; // 获取下一个目的地for (let i in arr) {// 当有车票时进行操作if (arr[i] > 0) {path.push(i); // 记录路径arr[i]--; // 更新车票数量// 向下查找if (backtracking()) {return true; // 找到符合条件的路径,返回 true}// 回溯path.pop();arr[i]++;}};return false;}backtracking();return res;
};

收获

回溯法本质就是一个暴力的深度优先搜索算法,递归的遍历中带有回溯,不可能出现结果的部分应该剪枝。

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

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

相关文章

JVM-运行时数据区程序计数器

运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 程序计数器的定义 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器…

1.3 Verilog 环境搭建详解教程

学习 Verilog 做仿真时&#xff0c;可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE&#xff08;目前已停止更新&#xff09;&#xff0c;VIVADO&#xff1b;因特尔公司的 Quartus II&#xff1b;ASIC 开发环境有 Synopsys 公司的 VCS &#xff1b;很多人也在用 Icarus…

PyTorch 2.2 中文官方教程(三)

使用 PyTorch 构建模型 原文&#xff1a;pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 ||…

Java风暴:打造高效作家信息管理平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Web项目利用EasyExcel实现Excel的导出操作

早期Java使用的一些解析&#xff0c;到处excel的框架存在种种问题被遗弃&#xff0c;现在使用阿里巴巴所提供的EasyExcel已成为一种主流&#xff0c;本篇将详细介绍该功能在Web项目中如何实际应用。 详细操作文档&#xff1a;写Excel | Easy Excel 一、项目演示 在后台管理界…

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目&#xff0c;路由模式采用history模式时&#xff0c;刷新页面之后&#xff0c;显示404。 路由模式 前端路由的基本作用为&#xff1a; ①当浏览器地址变化时&#xff0c;切换页面&#xff1b; ②点击浏览器后退、前进按钮时&#xff0c;更新网页内容&…

基于ISO13400 (DoIP) 实现车辆刷写

近年来&#xff0c;在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本&#xff0c;实现ADAS、信息娱乐系统等技术&#xff0c;还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断&#xff08;DoIP&#xff09;&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…

【Cocos入门】场景切换(loadScene、preloadScene)

一、loadScene 加载场景 loadScene(sceneName: string, onLaunched: Director.OnSceneLaunched, onUnloaded: Director.OnUnload) : boolean 通过场景名称进行加载场景。返回值为布尔类型 参数&#xff1a; NameTypeDescriptionsceneNamestring场景名称onLaunchedDirector.O…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核&#xff0c;想尝试的可以先使用&#xff1a; https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, IssueGoogle插件名称为&#xff1a;ChatGPT to MarkDown plus…

3.1 Verilog 连续赋值

关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; 格式如下 assign LHS_target RHS_expression &#xff1b; LHS&#xff08;left hand side&#xff09; 指赋值操作…

C#委托的前世今生

起因 很多C#初学者&#xff0c;都遇到过这样的问题——线程间操作无效&#xff0c;从不是创建控件的线程访问它。 今天就这个问题&#xff0c;展开分析。 溯源 先说下这个问题产生的根源。 大家都知道&#xff0c;程序运行起来之后&#xff0c;首先会有一个主线程&#xff…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Redis 持久化对性能有何影响?

Redis 持久化对性能的影响 Redis 是一个高性能的内存数据存储系统&#xff0c;通常被用于缓存、消息队列和数据存储等方面。由于 Redis 是基于内存的&#xff0c;因此它的读写速度非常快&#xff0c;可以满足高并发、低延迟的应用需求。但是&#xff0c;当 Redis 需要持久化数…

探索STM32CubeMX:图形化工具简化嵌入式软件开发

STM32CubeMX是由STMicroelectronics提供的一款图形化工具&#xff0c;旨在简化STM32微控制器的嵌入式软件开发过程。它提供了一种快速、直观的方式来生成初始化代码并配置STM32微控制器&#xff0c;帮助开发人员节省宝贵的开发时间&#xff0c;并降低入门门槛。本文将探索STM32…

政安晨:快速学会~机器学习的Pandas数据技能(四)(汇总与映射)

从数据中提取价值&#xff01; 概述 在上一篇文章中&#xff0c;我们学习了如何从DataFrame或Series中选择相关数据。从我们的数据表示中选择正确的数据对于完成工作非常重要&#xff0c;正如我们在练习中所演示的那样。 然而&#xff0c;数据并不总是以我们想要的格式直接从…

【力扣】两数之和,暴力枚举 + 哈希表

两数之和原题地址 方法一&#xff1a;暴力枚举 首先&#xff0c;我们需要枚举数组中所有可能的下标对组合&#xff0c;对于 n 个数的数组&#xff0c;从中选两个下标&#xff0c;有 种可能。做法很简单&#xff0c;遍历数组中的所有元素&#xff0c;对于每一个元素&#xff…

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…

【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、FreeXL介绍二、文件下载三、文件分析四、pro文件五、编译实践一、FreeXL介绍 【FreeXL跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台编译】:Linux环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台…