leetcode 332. Reconstruct Itinerary(重构行程)

在这里插入图片描述

有一些票tickets, tickets[ i ] = [from, to], 每个出发到达城市名字都是3个大写英文字母,
同一个出发城市时,优先去字母顺序较小的到达城市。
必须先从“JFK”出发。
每个ticket必须用且只用一次,所有ticket一定会形成至少一个有效的行程(出发至到达的一路上遍历所有城市)
按顺序记录行程上的城市并返回。

思路:

很容易想到DFS。
先建graph, 然后从“JFK”出发做DFS。
因为要先去字母顺序小的城市,所以graph的邻接链表中的链表用优先队列。
DFS用visited数组记录已经访问过的点,这里不用visited,遍历过的直接从优先队列中移除。
到目前为止,看起来不像是hard的题目。

但是,DFS中按顺序记录城市会有个问题。
举个例子

JFK -> KUC, NRT
NRT -> JFK

DFS中按顺序记录节点的结果是[JFK, KUC, NRT, JFK]
也就是说从JFK出发到KUC后,瞬间转移到NRT,再回JFK,这显然是不行的,这不是一个有效的行程。

实际上,这是一个欧拉路径的问题。
在一张图中,可以从一点出发遍历所有的边,每条边只能遍历一次,那么遍历过程中的这条路径就叫做欧拉路径。如果这条路径是闭合的,那就称为欧拉回路。也就是“一笔画”。

欧拉路径会用到Hierholzer算法。算法如下:

void dfs(int ver)
{对于ver的所有边:{if(未访问过){则标记为已访问 (这里从优先队列中移除访问过的点)dfs(这条边所连之点)}}ver 入栈
}
栈逆序即是路径

总结一下,还是DFS,但是不要正向记录节点,要先记录终点,倒着记录到起点。
理解为既然一定存在有效的路径,那么当一条路走不通,就去走其他相邻节点的路径,一定会有路径把这段接上。

class Solution {HashMap<String, PriorityQueue<String>> graph;List<String> res;public List<String> findItinerary(List<List<String>> tickets) {graph = new HashMap<>();res = new ArrayList<>();for(List<String> ticket : tickets){if(!graph.containsKey(ticket.get(0))){graph.put(ticket.get(0), new PriorityQueue<String>());}graph.get(ticket.get(0)).offer(ticket.get(1));}//DFSdfs("JFK");Collections.reverse(res);return res;}void dfs(String city){PriorityQueue<String> queue = graph.get(city);while(queue != null && queue.size() > 0) {String nextCity = queue.poll();dfs(nextCity);}res.add(city);}
}

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

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

相关文章

Pandas 数据变形和模型分析

数据概念 数据比对 在本练习中&#xff0c;我们使用灵活的比较技术对不同的DataFrame进行比较 import pandas as pd import randomrandom.seed(123) list1 [[A]*3,[B]*5,[C]*7] charlist [x for sublist in list1 for x in sublist] random.shuffle(charlist) ser1 pd.Se…

【JAVA-Day21】序列化和反序列化,学会Java的编解码方法

标题序列化和反序列化&#xff0c;学会Java的编解码方法 序列化和反序列化&#xff0c;学会Java的编解码方法摘要引言一、什么是序列化1.1 序列化的过程 二、什么是反序列化2.1 反序列化的过程 三、为什么要进行序列化和反序列化3.1 主要目的3.2 应用场景 四、总结参考资料 博主…

Springboot 实践(18)Nacos配置中心参数自动刷新测试

前文讲解了Nacos 2.2.3配置中心的服务端的下载安装&#xff0c;和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配&#xff0c;文中使用版本如下&#xff1a; ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…

辅助驾驶功能开发-功能规范篇(21)-4-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 • 超级自动泊车辅助(Super AutoParking Assist)、语音控制泊车辅助(Autoparking with Speech) - 产品定义 超级自动泊车辅助是⼀个增强的自动泊车辅助系统。在超级自动泊车辅助系统中,识别车位将会变得实时可见, 并且不可泊入的⻋位也将…

如何在 Excel 中计算日期之间的天数

计算两个日期之间的天数是 Excel中的常见操作。无论您是规划项目时间表、跟踪时间还是分析一段时间内的趋势&#xff0c;了解如何在 Excel 中查找日期之间的天数都可以提供强大的日期计算功能。 幸运的是&#xff0c;Excel 提供了多种简单的方法来获取两个日期之间的天数。继续…

数据可视化

一、Flask #通过访问路径&#xff0c;获取用户的字符串参数 app.route(/user/<name>) def welcome(name):return "你好&#xff0c;%s"%nameapp.route(/user/<int:id>) def welcome2(id):return "你好&#xff0c;%d号的会员"%id能够自动根据…

【初阶数据结构】树(tree)的基本概念——C语言

目录 一、树&#xff08;tree&#xff09; 1.1树的概念及结构 1.2树的相关概念 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二、二叉树的概念及结构 2.1二叉树的概念 2.2现实中真正的二叉树 2.3特殊的二叉树 2.4二叉树的性质…

字符集详解

一、为什么乱码&#xff1f; 所有的乱码实质上都是因为字符集选择错误造成的。 流在读取时&#xff0c;编码使用不当也会乱码。 二、什么是字符集&#xff1f; 字符是各种文字和符号的统称&#xff0c;包括各个国家的文字&#xff0c;标点符号&#xff0c;表情等等。字符集…

spring seccurity OAuth 2.0授权服务器工作流程

一、客户端配置&#xff1a;在configure(ClientDetailsServiceConfigurer clients)方法中&#xff0c;配置了一个客户端&#xff0c;包括客户端标识符、客户端秘密、授权类型、授权范围和令牌有效期等信息。这个客户端表示某个应用程序或服务&#xff0c;它将向授权服务器请求访…

MFC主框架和视类PreCreateWindow()函数学习

在VC生成的单文档应用程序中&#xff0c;主框架类和视类均具有PreCreateWindow函数&#xff1b; 从名字可知&#xff0c;可在此函数中添加一些代码&#xff0c;来控制窗口显示后的效果&#xff1b; 并且它有注释说明&#xff0c; Modify the Window class or styles here by…

Bash脚本学习:AWK, SED

1. AWK AWK 是一种编程语言&#xff0c;设计用于处理文件或数据流中基于文本的数据&#xff0c;或者使用 shell 管道。 可以将 awk 与 shell 脚本结合使用或直接在 shell 提示符下使用。 以上展示使用AWK分别打印第一个位置变量和第二个位置变量。 建立一个文档 csvtest.cs…

设计模式:单例模式

目录 什么是单例模式为什么使用单例模式常见的单例写法1. 懒汉式&#xff08;Lazy Initialization&#xff09;2. 双重检查锁定&#xff08;Double-Checked Locking&#xff09;3. 饿汉式&#xff08;Eager Initialization&#xff09;4. 枚举实现单例 总结 什么是单例模式 单…

AI深度学习-卷积神经网络000

文章目录 前言1.什么是深度学习2.语义分割与实例分割概述3.什么是卷积&#xff1f;4.Unet网络 前言 本栏目&#xff0c;主要为深度学习保姆教程。 主要通过B站视频整理而来&#xff1a; 深度学习保姆级教学 Unet语义分割视觉三维重建算法 1.什么是深度学习 深度学习保姆级教…

Scapy 解析 pcap 文件从HTTP流量中提取图片

Scapy 解析 pcap 文件从HTTP流量中提取图片 前言一、网络环境示例二、嗅探流量示例三、pcap 文件处理最后参考 ​ 作者&#xff1a;高玉涵 ​ 时间&#xff1a;2023.9.17 10:25 ​ 环境&#xff1a;Linux kali 5.15.0-kali3-amd64&#xff0c;Python 3.11.4&#xff0c;scapy…

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL 编译工具准备编译OpenSSL建立Hello World工程创建VS工程 编译工具准备 安装好Visual Studio。安装Perl, 主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好Open SSL源代码。 编译OpenSSL 安装Perl,并加入到path路径&#xff0c;检验…

HTML 学习笔记(基础)

它是超文本标记语言&#xff0c;由一大堆约定俗成的标签组成&#xff0c;而其标签里一般又有一些属性值可以设置。 W3C标准&#xff1a;网页主要三大部分 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript <!DOCTYPE html> <html lang"zh-…

SkyWalking快速上手(二)——架构剖析1

文章目录 介绍架构概述一、Agent组件介绍Agent的配置配置参数详解service_namesample_n_per_3_secsnamespacecollector.backend_service Agent的工作原理 二、Collector组件什么是Collector组件?Collector组件的配置配置Collector组件示例 总结 介绍 SkyWalking是一个开源的分…

使用 Feature Flags 实现数据库灰度迁移的监控与可观测性

作者&#xff1a;观测云与胡博 场景描述 很多企业会遇到数据库升级、或数据库迁移的情况&#xff0c;尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而&#xff0c;我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕…

后端中间件安装与启动(Redis、Nginx、Nacos、Kafka)

后端中间件安装与启动 RedisNginxNacosKafka Redis 1.打开cmd终端&#xff0c;进入redis文件目录 2.输入redis-server.exe redis.windows.conf即可启动&#xff0c;不能关闭cmd窗口 &#xff08;端口配置方式&#xff1a;redis目录下的redis.windows.conf配置文件&#xff0c;…

【第四阶段】kotlin语言的定义类和field关键字学习

1.普通成员变量背后隐士代码 为什么在kotlin中是private 可以直接调用&#xff0c;隐式代码如下 package Kotlin.Stage4class Test54{var name"kotlin"/*背后做的事NotNullprivate String name"kotlin";public void setName(NotNull String name){this.na…