当前位置: 首页 > news >正文

【LeetCode】公交路线 [H](宽度优先遍历)

815. 公交路线 - 力扣(LeetCode)

一、题目

给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。

例如,路线 routes[0] = [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... 这样的车站路线行驶。
现在从 source 车站出发(初始时不在公交车上),要前往 target 车站。 期间仅可乘坐公交车。

求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回 -1 。

示例 1:
输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
输出:2
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。 

示例 2:

输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
输出:-1

提示:

  • 1 <= routes.length <= 500.
  • 1 <= routes[i].length <= 105
  • routes[i] 中的所有值 互不相同
  • sum(routes[i].length) <= 105
  • 0 <= routes[i][j] < 106
  • 0 <= source, target < 106

二、代码

class Solution {// routes数组表示每一种公交线路包括哪些公交站// 0 : [1,3,7,0]   0号公交线路包括1、3、7、0这四个公交站// 1 : [7,9,6,2]// ....// 返回:返回换乘次数+1 -> 返回一共坐了多少次公交。public int numBusesToDestination(int[][] routes, int source, int target) {// 如果起点和目标一致,直接返回0if (source == target) {return 0;}// 全部的公交线路数int n = routes.length;// key : 车站// value : list -> 该车站被哪些线路拥有  list中存储的公交线路编号HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();// 根据routes数组构造出mapfor (int i = 0; i < n; i++) {// 遍历每一条路线下的每一个车站for (int station : routes[i]) {// 将每一个车站所在的线路编号加入到map中这个车站对应的value中// 如果这个车站还没有创建map,就手动创建一个if (!map.containsKey(station)) {map.put(station, new ArrayList<Integer>());}// station车站被i号路线拥有map.get(station).add(i);}}// 至此,通过map就可以快速取出一个车站可以通往哪些公交路线// 宽度优先遍历用的队列,里面加入的是公交线路编号ArrayList<Integer> queue = new ArrayList<>();// 标记路线是否已经被宽度优先遍历过了boolean[] set = new boolean[n];// 将起点能够走到的公交线路都取出来,这些公交线路就是我们一开始能走的路线for (int route : map.get(source)) {// 将公交线路加入到队列中queue.add(route);// 将这个线路标记为true,表示已经遍历到了set[route] = true;}// 记录换乘次数int cnt = 0;// 开始深度优先遍历,每次就直接把一层的都遍历出来while (!queue.isEmpty()) {// 记录下一层宽度遍历的路线列表ArrayList<Integer> nextRoutes = new ArrayList<>();// 遍历当前队列中的所有线路,表示当前能走到的线路for (Integer route : queue) {// 获取这些线路包括车站int[] stations = routes[route];// 遍历每一条线路的所有车站for (int station : stations) {// 如果这个车站就是终点,直接返回换乘次数+1if (station == target) {// 之所以加1,是因为cnt统计的是换乘次数,题目要求要返回乘坐公交车的数量,所以要加1return cnt + 1;}// 通过这个车站再去找下一次换乘能走到的路线由哪些。利用之前构造的map结构找for (int nextRoute : map.get(station)) {// 保证这个路线没有被遍历过if (!set[nextRoute]) {// 将这个路线加入到nextRoutes中,供下一层遍历使用nextRoutes.add(nextRoute);// 将这个路线标记为已经遍历到了set[nextRoute] = true;}}}}// 每遍历一层,换成次数就加1cnt++;// 将下一层的路线列表赋值给queue,作为下一轮遍历过程中可以走到的路线列表queue = nextRoutes;}// 不能走到就返回-1return -1;}
}

三、解题思路 

先把每个站点拥有哪些线路标好,这个线路就是指的routes[i]数组的下标,把每个站点和一个数字i绑定,那么就可以通过这个数字i,直接找到routes[i],这个就是这个站点所在的线路。

从source出发,先遍历source这个站点的所有所在路线,也就遍历出了第一层1、2、3这三条路线,表示source这个站点,下一步可以走到1、2、3这三条公交线路中(公交线路本身也是包含了多个站点的),我们也就知道了从source这个点,只换乘一次能到达的全新的线路有哪些,将这些路线加入到队列中,并且再去遍历一下这三条线路所经过的所有车站,就能够得到只换乘一次,能到达的所有车站有哪些,再通过这些车站,去找下一次换乘能到达的路线有哪些,将这些新路线存储到nextRoute数组中,供下一层宽度遍历时使用。

在宽度优先遍历过程中,每遍历一层,也就是换成次数加1,因为每一层的遍历就是从一个站点到另外的线路上,期间就是只需要换乘一次。两条线路虽然都有多个站点,但是只有两辆不同的车而已。

遍历完第一层后,下一层的宽度优先遍历就是在用相同的方法,以nextRoute数组中上一轮换乘一次可以来到的全新路线为起点,再遍历一下每一个路线只换乘一次就能到达的全新线路,然后再去看这些全新线路都能经过的车站都找出来,通过这些车站再去找下一轮换乘一次能到达的全新路线有哪些,存储到nextRoute数组中,在下层的遍历时就会将这些一次换乘就能走到的全新路线加入到队列中。整个流程就是每一次都直接把一整层遍历出来,完成深度优先遍历。

因为每次都是向外扩一层,按照宽度优先遍历的顺序来遍历,所以只要是在这个过程中找到了目的地target站点,那么记录的换乘次数一定是最少的。

相关文章:

【LeetCode】公交路线 [H](宽度优先遍历)

815. 公交路线 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&#xff0c;第 i 辆公交车将会在上面循环行驶。 例如&#xff0c;路线 routes[0] [1, 5, 7] 表示第 …...

报表生成器 FastReport .Net 用户指南 2023(十):Band的属性

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…...

DAMA数据管理知识体系指南之文档和内容管理

第10章 文档和内容管理 10.1 简介 文档和内容管理是对存储在关系数据库以外的信息的采集、存储、访问以及使用的控制活动。文档和内容管理的侧重点在完整性和访问控制上。因此&#xff0c;它与关系数据库的数据操作管理大致相同。由于多数非结构化数据与存储在结构化文件中的…...

C++入门:数据结构

C/C 数组允许定义可存储相同类型数据项的变量&#xff0c;但是结构是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许您存储不同类型的数据项。结构用于表示一条记录&#xff0c;假设您想要跟踪图书馆中书本的动态&#xff0c;您可能需要跟踪每本书的下列属性&#x…...

C语言实现烟花表白,内含源码!!

虽然现在看烟花有一定难度&#xff0c;但代码式烟花可以随时随地看&#xff01; 烟花的代码很多&#xff0c;实际上是可以用 Python、HTML5 等语言写烟花&#xff0c;但今天主要想和大家分享用C语言写的烟花代码&#xff0c;非常细致和实用。 同学们一定要亲自敲一遍&#xf…...

虚拟机安装CentOS 7(带界面)

目录 一、虚拟机安装CentOS 7&#xff08;带界面&#xff09; 1、打开下好的VMware&#xff0c;点击创建虚拟机 2、下一步 3、点击下一步 4、选择Linux&#xff0c;ContOS7&#xff0c;点击下一步 5、修改虚拟机名称和路径 6、下一步 7、点击自定义硬件 8、设置虚拟机大…...

Java测试——selenium具体操作

selenium的前置准备工作可以参考我之前的博客&#xff1a;Java测试——selenium的安装与使用教程 这篇博客讲解一下selenium的常见操作 先创建driver ChromeDriver driver new ChromeDriver();输入网址 driver.get("https://www.baidu.com");常见操作 查找元素…...

电子器件系列32:逻辑与门芯片74LS11

一、编码规则 先看看这个代码的意思&#xff1a;74LS11 74是一个系列&#xff08;74 表示为工作温度范围&#xff0c;74: 0 ~ 70度。&#xff09; ls的意思就是工艺类型&#xff08;Bipolar(双极)工艺&#xff09; 11是代码 什么是74系列逻辑芯片&#xff1f; - 知乎 什么是…...

LeetCode-101. 对称二叉树

目录题目分析递归法题目来源 101. 对称二叉树 题目分析 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0c;理解这一…...

使用intlinprog求解指派问题MATLAB代码分享

% 输入指派矩阵C [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];f C(:); %生成一个列向量&#xff0c;作为目标函数系数&#xff0c;matlab默认以列排序[m,n] size(C);Aeq zeros(2*n,n*n); %2*n个等式约束&#xff0c;n*n个变量for i 1:n %这里先生成的是后5个…...

Spark On YARN时指定Python版本

坑很多&#xff0c;直接上兼容性最佳的命令&#xff0c;将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…...

[数据库]库的增删改查

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…...

Wine零知识学习1 —— 介绍

一、什么是Wine Wine是“Wine Is Not an Emulator” 的首字母缩写&#xff0c;是一个能够在多种POSIX-compliant操作系统&#xff08;诸如Linux、macOS及BSD等&#xff09;上运行 Windows 应用的兼容层。Wine不像虚拟机或者模拟器那样模仿内部的Windows逻辑&#xff0c;而是將…...

设计模式--建造者模式 builder

设计模式--建造者模式 builder&#xff09;建造者模式简介建造者模式--小例子&#xff08;电脑购买&#xff09;1.产品类2.抽象构建者3.实体构建类4.指导者类5.客户端测试类小结建造者模式简介 建造者模式有四个角色,概念划分如下&#xff1a; Product &#xff1a; 产品类&a…...

终于周末啦,继续来总结一下Python的一些知识点啦

目录 Python概念梳理 常见概念梳理 Python经典判断题 判断题 选择题 Python概念梳理 常见概念梳理 Python中&#xff0c;不仅仅变量的值是可以变化的&#xff0c;类型也是可以随时变化的 1、Python的变量必须初始化否则提示 is not defined 2、if、while中定义的变量在…...

CUDA By Example(八)——流

文章目录页锁定主机内存可分页内存函数页锁定内存函数CUDA流使用单个CUDA流使用多个CUDA流GPU的工作调度机制高效地使用多个CUDA流遇到的问题(未解决)页锁定主机内存 在之前的各个示例中&#xff0c;都是通过 cudaMalloc() 在GPU上分配内存&#xff0c;以及通过标准的C库函数 …...

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …...

less常用语法总结

CSS预处理器 CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器;没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量…...

DHCP Relay中继实验

DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配&#xff0c;而PC要求分配固定的地址&#xff0c;网段信息已经在图中进行标明。 设备配置 AR1&#xff1a; AR1作为DHCP Server基本配置跟DHCP Server没区别&#xff0c;不过要加一条静态路由&#xff…...

“1+1>2”!《我要投资》与天际汽车再度“双向奔赴”!

文|螳螂观察 作者| 图霖 胡海泉老师重磅回归、创始人现场真情告白……新一季的《我要投资》&#xff0c;不仅维持了往季在专业度上的高水准&#xff0c;也贡献了不少高话题度的“出圈”时刻。 在竞争激烈的的综艺节目竞技场&#xff0c;能举办数季的节目&#xff0c;往往都是…...

【分享】订阅金蝶KIS集简云连接器同步OA付款审批数据至金蝶KIS

方案简介 集简云基于钉钉连接平台完成与钉钉的深度融合&#xff0c;实现钉钉OA审批与数百款办公应用软件&#xff08;如金蝶KIS、用友等&#xff09;的数据互通&#xff0c;让钉钉的OA审批流程与企业内部应用软件的采购、付款、报销、收款、人事管理、售后工单、立项申请等环节…...

dubbo服务消费

dubbo在服务消费时调用的方法栈比较深&#xff0c;所以得一边看一边记&#xff0c;还是比较费力的。在dubbo服务发现中&#xff0c;我们看到通过ReferenceConfig#get()返回的是要调用接口的代理对象&#xff0c;因此通过接口的代理对象调用方法时是调用InvocationHandler(Invok…...

Python调用API接口,实现人脸识别

人生苦短&#xff0c;我用Python 在开始之前&#xff0c;先问问大家&#xff1a; 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的**在线接口SDK模块&#xff08;baidu-aip&#xff09;**进行实现人脸识…...

2月10日刷题总结

编辑距离题目描述设 AA 和 BB 是两个字符串。我们要用最少的字符操作次数&#xff0c;将字符串 AA 转换为字符串 BB。这里所说的字符操作共有三种&#xff1a;删除一个字符&#xff1b;插入一个字符&#xff1b;将一个字符改为另一个字符。A, BA,B 均只包含小写字母。输入格式第…...

C++学习/温习:新型源码学编程(三)

写在前面(祝各位新春大吉&#xff01;兔年如意&#xff01;) 【本文持续更新中】面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xf…...

阿里云ecs服务器搭建CTFd(ubuntu20)

1.更新apt包索引 sudo apt-get update更新源 1、使用快捷键【ctrlaltt】打开终端。 2、输入以下命令备份原有软件源文件。 cp /etc/apt/sources.list /etc/apt/sources.list.bak_yyyymmdd 3、再输入以下命令打开sources.list文件并添加新的软件源地址。 vim /etc/apt/sources.…...

视频号小店新订单如何实时同步企业微信

随着直播带货的火热&#xff0c;视频号小店也为商家提供商品信息服务、商品交易&#xff0c;支持商家在视频号运营电商&#xff0c;许多企业也将产品的零售路径渗透至视频号小店中了。如果我们希望在视频号小店接收到订单后&#xff0c;能尽快及时发货&#xff0c;给用户较好的…...

ag-Grid Enterprise

ag-Grid Enterprise Ag-Grid被描述为一种商业产品&#xff0c;已在EULA下分发&#xff0c;它非常先进&#xff0c;性能就像Row分组一样&#xff0c;还有范围选择、master和case、行的服务器端模型等等。 ag Grid Enterprise的巨大特点&#xff1a; 它具有以下功能和属性&#x…...

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…...

【C++】类和对象(下)

文章目录1. 再谈构造函数1.1 初始化列表1.2 explicit关键字2. static成员2.1 概念2.2 特性3. 友元3.1 友元函数3.1 友元类4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象1. 再谈构造函数 1.1 初始化列表 在创建对象时&#xff0c;编译器通过调用构造…...

公司做公司网站广告/谷歌网站推广

Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制&#xff0c;不过你可以选择选择其他的实现方式。理想的实现取决于你的应用程序使用何种资源&#xff0c;你愿意在性能、安全、系统稳健性、数据完整方面做出何种权衡。在这次JavaWorld…...

东营网站建设优化/google中文搜索引擎

前言今天跟大家分享下SpringBoot 常见高频面试题的知识。下面是小编关于SpringBoot的知识点总结了一个思维导图&#xff0c;希望对大家所有帮助&#xff01;话不多说&#xff0c;下面我们开始正题&#xff1a;1. 什么是SpringBoot?通过Spring Boot&#xff0c;可以轻松地创建独…...

35公司做的网站漏洞/如何做好关键词的优化

基本类型&#xff0c;或者叫做内置类型&#xff0c;是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型。java是一种强类型语言&#xff0c;第一次申明变量必须说明数据类型&#xff0c;第一次变量赋值称为变量的初始化。 1、基本类型及其封装器类 Java基本类型共有…...

类似凡科网的网站/小程序开发收费价目表

缘起 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;还有应用之间的互相调用等等问题&#xff0c;插件化技术应用而生。如果没有插件化技术&#xff0c;美…...

ps网页版在线制作/家庭优化大师

引用&#xff1a;http://www.williamlong.info/archives/3181.html CC攻击&#xff08;Challenge Collapsar&#xff09;是DDOS&#xff08;分布式拒绝服务&#xff09;的一种&#xff0c;也是一种常见的网站攻击方法&#xff0c;攻击者通过代理服务器或者肉鸡向向受害主机不停…...

日本建设网站/搜狗指数官网

public class LayoutAnimationController extends Object java.lang.Object ↳ android.view.animation.LayoutAnimationController 可以看出LayoutAnimationController类直接继承Object类&#xff0c;用于在组件上添加一些动画效果&#xff0c;这些组件包括常用的ListVie…...