力扣日记3.3-【回溯算法篇】332. 重新安排行程

力扣日记:【回溯算法篇】332. 重新安排行程

日期:2023.3.3
参考:代码随想录、力扣
ps:因为是困难题,望而却步了一星期。。。T^T

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
  • from_i.length == 3
  • to_i.length == 3
  • from_i 和 to_i 由大写英文字母组成
  • from_i != to_i

题解

cpp ver
class Solution {
public:// 关键1:使用 unordered_map targets <string, map<string, int>> 记录各段航线(<起点, <终点, 航线次数>>)// 一个起点机场可能映射多个终点,所以用unordered_map;// 且相同起点的不同航线之间按字典顺序排(即终点机场按字母序排列,按照这种顺序进行遍历得到的行程即满足题目要求的最小行程),所以用map,其中航线次数记录剩余次数(为1则表示该航线未走,为有效)vector<string> findItinerary(vector<vector<string>>& tickets) {// 初始化targetsunordered_map<string, map<string, int>> targets;for (const vector<string>& vec : tickets) {targets[vec[0]][vec[1]]++; // 记录映射关系 vec(即vector<string>)中包含两个机场,第一个str为起点,第二个为终点}// 初始化pathvector<string> path;path.push_back("JFK");  // 第一个机场一定是JFKbacktracking(tickets.size(), targets, path);return path;}// 返回值与参数:由于只需要一条有效行程,所以当成功收集时,通过返回true来终止各层递归// 参数为记录tickets中的航线数量的ticketNum,记录各段航线的targets(相当于总集合)// 以及记录最小有效行程的path(由于只需要一条有效行程,所以不需要results收集path)(这些参数也可以都作为全局变量)bool backtracking(int ticketNum, unordered_map<string, map<string, int>>& targets, vector<string>& path) {// 终止条件:当path中的机场个数为航线数+1时,说明全部航线已走完if (path.size() == ticketNum + 1) {return true;    // 注意这里是返回true,且不再需要results收集path}// for循环// 关键2:在树状结构中,某一节点的横向遍历表示,以当前所在机场为起点,遍历选取对应目的机场(一个机场对应0或多个目的机场)// 当前所在机场即path中最后一个机场即path[path.size()-1],而targets[起点机场]则记录了以该机场为起点的对应终点for (pair<const string, int> &target : targets[path[path.size() - 1]]) { // 遍历各个机场终点<终点,航线次数>// 注意这里target一定要加&才能修改到targets中的航线次数// 而加上引用之后,就必须在 string 前面加上 const,因为map中的key 是不可修改的(语法规定)// 只有当前航线次数>0(表示此航线存在且未走过)才能选取,防止重复走if (target.second > 0) {path.push_back(target.first);   // 存储该机场target.second--;    // 航线次数-1// 递归(关键3:通过返回值判断是否提前结束)if (backtracking(ticketNum, targets, path)) return true;// 如果走了错误的路(即遍历到没有对应终点了也没有达到终止条件)则回溯target.second++;path.pop_back();}}return false;}
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 见注释
  • 思路来源于代码随想录

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

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

相关文章

牛客小白月赛86

A-水盐平衡_牛客小白月赛86 (nowcoder.com) #include<bits/stdc.h> #define endl \n #define int long long using namespace std; int a,b,c,d; void solve() {cin>>a>>b>>c>>d;if((double)a/b>(double)c/d) cout<<S<<endl;els…

关于脉冲负载应用中电阻器,您需要了解的 11 件事?

不幸的是&#xff0c;电阻器在脉冲负载下可能会失效。当脉冲功率耗散到器件的电阻元件时&#xff0c;它会产生热量并增加电阻器的温度。过热会损坏电阻元件&#xff0c;导致电阻变化甚至设备开路。为了避免在设计中出现这种情况&#xff0c;以下是您在选择元件时应了解的有关电…

excel统计分析——拉丁方设计

参考资料&#xff1a;生物统计学 拉丁方设计也是随机区组设计&#xff0c;是对随机区组设计的一种改进。它在行的方向和列的方向都可以看成区组&#xff0c;因此能实现双向误差的控制。在一般的试验设计中&#xff0c;拉丁方常被看作双区组设计&#xff0c;用于提高发现处理效应…

Skipped breakpoint at because it happened inside debugger evaluation亲测可用

问题描述&#xff1a; 在多线程项目中&#xff0c;在idea中打断点时&#xff0c;有时会遇到下面这种情况&#xff1a; idea左下角出现一行红底或者绿底文字提示&#xff1a; Skipped breakpoint at because it happened inside debugger evaluation 然后我们能感受到的就是…

HTML中自定义鼠标右键菜单

今天突然有人跟我提到了HTML中如何自定义鼠标右键菜单&#xff0c;这里大概记录一下吧&#xff0c;方便下次直接复制。免得还去看API文档。 文章目录 HTML中自定义鼠标右键菜单结果如下所示可以稍微改一下鼠标悬浮到右键菜单时的样式结果如下所示 只在某个特定的div才可以显示…

javascript 的eval()和with是干嘛的

原来JavaScript 中的eval() 和 with 是两个强大的功能&#xff0c;但同时它们也具有潜在风险的特性&#xff0c;所以谨慎使用。 首先说说eval() 函数&#xff1a; 它接收一个字符串参数&#xff0c;并将其作为 JavaScript 代码来解析和执行。 这意味着你可以使用 eval() 动态地…

《Scratch等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《Scratch等级认证CCF-GESP真题解析》 🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》Scratch图形化编程(1~4级)历届真题解析。 🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,限时9.9元,欢迎订阅! Scratch图形化编程一级 序…

2368. 受限条件下可到达节点的数目

2368. 受限条件下可到达节点的数目 题目链接&#xff1a;2368. 受限条件下可到达节点的数目 代码如下&#xff1a; //深度优先遍历 //参考&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/solutions/2662538/shu-shang-dfspythonjavacgojsrust-…

C++自学精简实践教程

一、介绍 1.1 教程特点 一篇文章从入门到就业有图有真相&#xff0c;有测试用例&#xff0c;有作业&#xff1b;提供框架代码&#xff0c;作业只需要代码填空规范开发习惯&#xff0c;培养设计能力 1.2 参考书 唯一参考书《C Primer 第5版》​参考书下载&#xff1a; 蓝奏云…

Acwing---3777. 砖块

砖块 1.题目2.基本思想3.代码实现 1.题目 n 个砖块排成一排&#xff0c;从左到右编号依次为 1∼n。 每个砖块要么是黑色的&#xff0c;要么是白色的。 现在你可以进行以下操作若干次&#xff08;可以是 0 次&#xff09;&#xff1a; 选择两个相邻的砖块&#xff0c;反转它…

STL——stack

目录 stack stack都有哪些接口 模拟实现一个stack stack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即…

数据分析-Pandas数据的画图设置

数据分析-Pandas数据的画图设置 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#x…

春招!启动了

大家好&#xff0c;我是洋子。今年的春招很多企业已经开始招聘了&#xff0c;像美团今年继续发力&#xff0c;24届春招以及25届暑期转正实习一共招聘4000人。另外&#xff0c;阿里&#xff0c;京东&#xff0c;顺丰等公司也已经开始春招&#xff0c;可以说招聘的号角已经正式吹…

GO语言学习笔记(与Java的比较学习)(十)

错误处理与测试 Go 没有像 Java 和 .NET 那样的 try/catch 异常机制&#xff1a;不能执行抛异常操作。但是有一套 defer-panic-and-recover 机制 错误处理 Go 有一个预先定义的 error 接口类型 type error interface {Error() string } errors 包中有一个 errorString 结构…

十二、类与声明

类与声明 什么是类&#xff1f; 前情总结 前面22讲的课基本上就做了两件事 学习C#的基本元素学习类的成员 析构函数&#xff1a; 当对象不再被引用的时候&#xff0c;就会被垃圾回收器gc&#xff0c;回收。而收回的过程当中&#xff0c;如果需要做什么事情&#xff0c;就放在…

远程调用--Http Interface

远程调用--Http Interface 前言1、导入依赖2、定义接口3 创建代理&测试4、创建成配置变量 前言 这个功能是spring boot6提供的新功能&#xff0c;spring允许我们通过自定义接口的方式&#xff0c;给任意位置发送http请求&#xff0c;实现远程调用&#xff0c;可以用来简化…

已解决org.springframework.dao.DataRetrievalFailureException数据检索失败异常的正确解决方法,亲测有效!!!

已解决org.springframework.dao.DataRetrievalFailureException数据检索失败异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 总结 在使用Spring Framework进行数据库操作时&…

关于硅金属电阻器?

EAK金属硅电阻器类似于陶瓷复合电阻器&#xff0c;在脉冲负载方面具有优势&#xff0c;需要高峰值功率或高电压与低电感&#xff08;如预充电电路&#xff09;的组合。硅金属电阻器具有更高的连续额定温度&#xff0c;为 350C&#xff0c;而陶瓷电阻器为 250C。这种扩展的温度范…

[蓝桥杯 2023 省 B] 冶炼金属

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 参考题解&#xff1a; #C3150——蓝桥杯2023年第十四届省赛真题-冶炼金属(分块)-Dotcpp编程社区 https://www.bilibili.com/video/BV1wc411x7KU/?spm_id_from333.1007.top_right_bar_windo…

RT-Thread操作系统 串口DMA接收时数据被拆分多包

一、问题现象 在使用RT Thread操作系统&#xff0c;串口DMA接收数据时&#xff0c;通过log打印发现&#xff0c;例如GPS NEMA数据一包数据量较大或者时&#xff0c;接收到的数据被拆分多包处理&#xff1b; 二、问题解决方案 修改DMA驱动程序 在drivers/drv_usart.c中屏蔽如…