力扣(leetcode)每日一题 815 公交路线 (图的宽度优先遍历变种)

embedded/2024/11/15 7:05:30/

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

解法

首先,你需要一个车站对应公交车列表的hashmap
然后,你得到出发点车站。将对应的公交车列表都取出来,对应公交车列表对应的所有站台都拿出来。然后阶段距离。 一次类推。
也就是原来是点和点之间的连接,这里多了一层中介,就是公交车站台。

public static int numBusesToDestination(int[][] routes, int source, int target) {if (source == target) { // 目的地和出发点重合,且公交车不经过改地点return 0;}// routes  公交车对应的是目车站列表// 数值和车站HashMap<Integer, List<Integer>> map = new HashMap<>(); // 车站对应的公交车列表for (int i = 0; i < routes.length; i++) {int[] route = routes[i];for (int key : route) {List<Integer> list = map.getOrDefault(key, new ArrayList<>());list.add(i);map.put(key, list);}}if (map.get(source) == null || map.get(target) == null) {return -1;}HashSet<Integer> set = new HashSet<>(); // 这里记录HashMap<Integer, Integer> dict = new HashMap<>();// ArrayDequeArrayDeque<Integer> deque = new ArrayDeque<>();dict.put(source, 0);deque.add(source); // 车站出发点while (!deque.isEmpty()) {Integer pointx = deque.poll();  // 弹出车站Integer distance = dict.get(pointx);List<Integer> list = map.get(pointx);  // 得到公交车列表for (int i = 0; i < list.size(); i++) {Integer car = list.get(i); // 获取公交车if (!set.contains(car)) {  // 这个公交车没有用过int[] route = routes[car];   // 得到所有对应的车子for (int j = 0; j < route.length; j++) {int pointy = route[j];if (!dict.containsKey(pointy)) {dict.put(pointy, distance + 1);deque.add(pointy);}}set.add(car);}}}if (dict.get(target) != null) {return dict.get(target);}return -1;}

http://www.ppmy.cn/embedded/114522.html

相关文章

96 kHz、24bit 立体声音频ADC芯片GC5358描述

概述&#xff1a; GC5358 是一款高性能、宽采样率、立体声音频模数转换器。其采样率范围是8KHz~96KHz&#xff0c;非常适合从消费级到专业级的音频应用系统。单端模拟输入不需要外围器件。GC5358 音频有两种数据格式&#xff1a;MSB对齐和 I2S 格式&#xff0c;和各种如 DTV、D…

Vue.js 的 Mixins

Vue.js 的 Mixins 是一种非常强大且灵活的功能&#xff0c;它允许你封装可复用的 Vue 组件选项。Mixins 实际上是一种分发 Vue 组件可复用功能的非常灵活的方式。一个 mixin 对象可以包含任意组件选项。当组件使用 mixin 时&#xff0c;所有 mixin 选项将被“混入”该组件本身的…

NLP 主要语言模型分类

文章目录 ngram自回归语言模型TransformerGPTBERT&#xff08;2018年提出&#xff09;基于 Transformer 架构的预训练模型特点应用基于 transformer&#xff08;2017年提出&#xff0c;attention is all you need&#xff09;堆叠层数与原transformer 的差异bert transformer 层…

【redis】常用数据类型及命令

通用命令 exists 判断key是否存在,返回1或0 del 删除key,key存在时返回1&#xff0c;key不存在时返回0 type 获取key类型 ttl 获取key剩余生存时间,-2表示key不存在,-1表示key永久生存 String类型 介绍 String类型是Redis最基本的数据类型&#xff0c;它存储的是字符…

setImmediate() vs setTimeout() 在 JavaScript 中的区别

setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中&#xff0c;setImmediate() 和 setTimeout() 都用于调度任务&#xff0c;但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名&#xff0c;尤其是在 Node.js 环境…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

计算机网络 8.*结构化布线

第八章 结构化布线 第一节 结构化布线基础 一、认识结构化布线 1.定义&#xff1a;在建筑物或楼宇内安装的传输线路&#xff0c;是一个用于语音、数据、影像和其他信息技术的标准结构化布线系统。 2.任务&#xff1a;使语音和数据通信设备、交换设备和其他信息管理系统彼此相…

在Ubuntu 16.04上使用rbenv安装Ruby on Rails的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Ruby on Rails 是开发人员创建网站和 Web 应用程序时最受欢迎的应用程序堆栈之一。Ruby 编程语言与 Rails 开发框架相结合&#x…