【LeetCode】Day201-重新安排行程

news/2023/5/28 8:22:24

题目

332.重新安排行程【困难】

题解

这道题的几个难点:

  1. 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
  2. 有多种解法,字母序靠前排在前面,应该如何记录映射关系?
  3. 使用回溯法,终止条件是什么?
  4. 搜索的过程中,如何遍历一个机场所对应的所有机场?

如何理解死循环

如图情况,若没有处理好,可能在JFK和NRT之间形成死循环
在这里插入图片描述

如何记录映射关系

一个机场映射多个机场,机场之间要靠字母序排列,可以使用HashMap记录
定义如下:

Map<String,Map<String, Integer>>map:Map<出发机场,Map<到达机场,航班次数>>map

为什么一定要增删元素呢?因为出发机场和到达机场会重复,搜索的过程没及时删除目的机场就会死循环。

在遍历Map<出发机场,Map<到达机场,航班次数>>map过程中,可以使用“航班次数”这个字段做加减,来标记到达机场是否使用过了。

如果“航班次数”大于0,说明目的地还可以飞,如果“航班次数”等于0说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。(相当于说我不删,我就做一个标记!

回溯法

递归树

在这里插入图片描述

回溯三部曲

  1. 递归函数参数
    使用Map<出发机场,Map<到达机场,航班次数>>map记录航班的映射关系

注意这里函数返回值是boolean!而不是通常用的void!

因为我们只需要找到一个行程,就是在树形结构中唯一一条通向叶子节点的路线,如上递归树所示。

  1. 递归终止条件
    回溯过程中遇到的机场个数,达到了(航班数量+1),就找到了一个行程,将所有航班串在一起了。
if(res.size()==n+1){return;
}
  1. 单层搜索过程
    回溯的过程中,如何遍历一个机场所对应的所有机场呢?
for (pair<const string, int>& target : targets[result[result.size() - 1]]) {if (target.second > 0 ) { // 记录到达机场是否飞过了result.push_back(target.first);target.second--;if (backtracking(ticketNum, result)) return true;result.pop_back();target.second++;}
}

完整代码

回溯法代码实在是太麻烦了,还是换成官方题解的**“Hierholzer 算法”**了,用于在连通图中找欧拉路径

对于航班映射关系的存储和上面不同,这种写法简便很多,也方便删除!

class Solution {List<String>res=new ArrayList<>();Map<String,PriorityQueue<String>>map=new HashMap<>();public List<String> findItinerary(List<List<String>> tickets){int n=tickets.size();//初始化航班映射关系for(List<String>ticket:tickets){String src=ticket.get(0),dest=ticket.get(1);//首次存入新建优先队列if(!map.containsKey(src))map.put(src,new PriorityQueue<>());map.get(src).add(dest);}//深搜dfs("JFK");Collections.reverse(res);//最先找到的是最深的不能再走的目的地,所以要反转过来return res;}public void dfs(String src){//当传入的参数是始发地而且还有边的时候,取边出队删除并且继续递归深搜这条边的点,一直到不能再走再返回while(map.containsKey(src)&&map.get(src).size()>0)dfs(map.get(src).poll());res.add(src);}
}

时间复杂度:O(mlogm)O(mlogm)O(mlogm),m是边的数量,对于每一条边需要O(logm)删除它。

空间复杂度:O(m)O(m)O(m),需要存储每一条边。

p.s 最近一直在攻回溯,在二刷有些题,力扣系列都没有更新
p.p.s 力扣终于刷到300题了!按理说一天一道应该早就到了,可惜中间摸鱼了太多天,最近要抓紧进度了
300题纪念

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统原理 实验2 《Allocation Reclaim》

操作系统原理 实验2 《Allocation & Reclaim》 >>本实验源码 一、实验目的 帮助了解在不同的存储管理方式下&#xff0c;应怎样实现主存空间的分配和回收。 二、实验内容 1、主存储器空间的分配和回收&#xff1a; 2、在可变分区管理方式下&#xff0c;采用最先…

TiStack私有云超融合解决方案

工业1.0&#xff0c;机械化和蒸汽机改变了传统手工制造方式&#xff1b;工业2.0&#xff0c;流水线、电气化大幅提高了生产效率&#xff1b;工业3.0&#xff0c;自动化、计算机等信息化技术被集成到生产制造中&#xff1b;工业4.0&#xff0c;智能制造成为主流。工业智能化转型…

图鸭科技完成A轮融资:打造新一代图像视频压缩解决方案...

逆势而上的故事不断上演。 近日&#xff0c;视频压缩技术服务商图鸭科技对外宣布&#xff0c;已于2018年12月底完成数千万元人民币A轮融资。本轮融资由金沙江创投领投&#xff0c;新进资本跟投&#xff0c;老股东淡马锡集团祥峰投资、魔量资本、拉尔夫创投、天使湾创投持续加码…

创业路上有指引,永洪CEO给企业服务型创业公司的融资建议

新年伊始&#xff0c;腾讯云TVP找我做创业的融资分享。我们都知道&#xff0c;融资是现代创业型企业快速发展壮大的重要方式&#xff0c;永洪科技也因此受益。但融资是一把双刃剑&#xff0c;也有一些创业公司因融资不当而受到损失。自创业以来&#xff0c;永洪科技得到了腾讯云…

投融资项目入门和总结

广东创业创新大赛 http://www.gdhrss.gov.cn/zcb/index.html 写出价值千万的融资BP https://appg03kmln18610.h5.xiaoeknow.com/v1/course/column/p_5f69c9a2e4b01b26d1bba6df?type3 概述主题 目标用户的痛点与需求 解决方案与产品 市场规模 竞争对手 运营状况 未来规…

Arduino融资3200万美元,进军企业市场

关注星标公众号&#xff0c;不错过精彩内容素材来源 | 网络微信公众号 | 嵌入式专栏开源电子平台 Arduino 近日宣布完成了 3200 万美元 B 轮融资。本轮融资由罗伯特博世风险公司&#xff08;RBVC&#xff09;领投&#xff0c;瑞萨电子&#xff08;Renesas&#xff09;、Anzu Pa…

剖析云解决方案

1. 解决方案的困境做云计算这么多年&#xff0c;不管是同事和客户&#xff0c;给我打击最大的话总是&#xff1a;“你给我出个方案吧……”他们所要的“方案”可能就是改一下logo、标题和报价单&#xff0c;剪切复制一下母版PPT里的客户案例就行。但这种对方案的糊弄凑合&#…

mysql读写分离实现方式_MySQL实现读写分离的两种经典方案

前言如果主库只负责所有的读写操作&#xff0c;而从库只实现备份功能&#xff0c;这样的主从架构看起来性价比似乎不是很高。我们所希望的主从架构是&#xff0c;当我们在写数据时&#xff0c;请求全部发到Master节点上&#xff0c;当我们需要读数据时&#xff0c;请求全部发到…

一级建造师如何通过选课科提高通过率?来谈谈对一建的一些见解

一年最适合学几科&#xff1f;如果是准备第一次考试&#xff0c;建议一次性申请全部四门考试。第一&#xff0c;一级建造师考试每年都会有一两个问题。比如今年的实践比较简单&#xff0c;法律法规复习也不错&#xff0c;可以通过这两门课。明年可能是管理和经济相对简单的转折…

必看!一级建造师考试科目分析!

一级建造工程师的考试是大家公认的难度大&#xff0c;通过率比较低&#xff0c;有很多考生朋友一直参加考试也没有通过&#xff0c;我们要学会找原因&#xff0c;最常见的是对考试认识不清晰&#xff0c;学习时间与学习方法上面的问题。 报考一建需要考试四个科目&#xff0c;…

再创新高?2022年全国一级建造师考试人数会破150万?

1、一级建造师考试报考人数汇总 2021年&#xff0c;大约有150万人报考一级建造师考试&#xff0c;报考人数最多的建筑实务专业&#xff0c;约72万人&#xff0c;占一建的一半&#xff0c;其次是市政专业。 报考人数约34万人&#xff0c;机电专业约32万人&#xff0c;公路实务专…

取得一级建造师证书有哪些好处?

一级建造师考试自产生以来&#xff0c;已经走过了十几个年头&#xff0c;每年都会有很多职场人士报名参加。通过考试的人员&#xff0c;可以在规定的时间领取证书。那么&#xff0c;取得一级建造师证书有哪些好处&#xff1f; 据了解&#xff0c;拿到一级建造师证书还是有很多…

【青训营】性能优化和自动内存管理

本文整理自&#xff1a;第五届字节跳动青年训练营 后端组 什么是性能优化 提高软件系统处理能力&#xff0c;减少不必要消耗&#xff0c;充分利用计算机算力 业务层优化 针对特定场景和具体问题容易获得较大收益 语言运行时优化 面向全公司的优化&#xff0c;非特定场景解决更…

一级建造师考哪个专业好?

一建有哪些专业 一级建造师目前分为10类专业方向&#xff1a;建筑工程、公路工程、水利水电工程、市政公用工程、矿业工程、机电工程、公路工程、铁路工程、通信与广电工程、港口与航道工程、民航机场工程。 从考试通过率看难度排名&#xff1a; 1.建筑&#xff1a;通过率较…

一级建造师为什么那么难通过?

一级建造师考试确实不容易&#xff0c;要不然为什么很多人考了好几年都没通过&#xff0c;还有好多人根本就不敢报考。 但是&#xff0c;这个考试并不是那么高不可测&#xff0c;其实相对于高考来说&#xff0c;那还是简单多了。 一建难通过的原因&#xff0c;主要有2个&#…

一级建造师的2017年通过率及历年通过率分析

5 众所周知&#xff0c;一建难&#xff0c;通过率低&#xff0c;但低到多少&#xff0c;历年来从未有官方数据说明&#xff0c;2015年一建考试已尘埃落定&#xff0c;下面就一级建造师历年通过率数据统计。 以下数据指往年本科考生一级建造师通过率&#xff0c;数据来源网络&am…

ExaGrid在The Storries XVI上入围“2019年存储奖”

该公司获得六个类别提名 马萨诸塞州马尔堡--(美国商业资讯)--领先的智能超融合备份存储器供应商ExaGrid今日宣布&#xff0c;该公司在《存储杂志》(Storage Magazine)举办的年度颁奖典礼The Storries XVI上获得六个类别提名。ExaGrid已入围“年度最佳企业备份硬件产品”(Enterp…

【East!_XVI】九尾妖狐 最小割

题目&#xff1a;http://hzwer.com/6541.html 其实关于最小割来划分集合的问题我在善意的投票里已经提到过了&#xff0c;这一道题也是一样的&#xff0c;只是一开始被10000的数据范围给吓到了&#xff0c;但其实仔细分析虽然点多&#xff0c;但是层数是非常小的&#xff0c;所…

激光SLAM之Gmapping(2)算法分析解读

激光SLAM之Gmapping&#xff08;2&#xff09;算法分析解读 Gmapping的程序框架是依托Open_slam&#xff0c;该框架主要分成slam_gmapping和openslam_gmapping。在slam_gmapping可以从Lasercallback出发&#xff0c;作为整个框架的起点&#xff0c;Lasercallback函数在slam_gma…

斜率优化DP基础XVI Open Cup named after E.V. Pankratiev. GP of Ukraine.K

这个 基本上和上一个 一样。 #include <bits/stdc.h> const long long mod 1e97; const double ex 1e-10; #define inf 0x3f3f3f3f #define iinf 0x3f3f3f3f3f3f3f3f using namespace std; long long dp[3011][5011]; long long sum[5011]; long long Tsum[5011]; int …