【每日一题】LeetCode 815.公交路线(广度优先搜索、数组、哈希表)

news/2024/9/18 20:39:04 标签: leetcode, 宽度优先, 散列表, 算法, 数据结构

【每日一题】LeetCode 815.公交路线(广度优先搜索、数组、哈希表)

题目描述

给定一个表示公交线路的数组 routes,其中每个 routes[i] 表示第 i 辆公交车的循环行驶路线。现在从 source 车站出发,要前往 target 车站,期间只能乘坐公交车。要求找出最少乘坐的公交车数量。如果无法到达目标车站,则返回 -1

思路分析

这个问题可以通过图的广度优先搜索(BFS)来解决。我们可以将每个车站看作图中的一个节点,每辆公交车可以看作连接这些节点的边。具体步骤如下:

  1. 建立车站到公交车的映射:首先,我们需要建立一个映射,将每个车站映射到经过该车站的所有公交车。

  2. 判断起点和终点是否可达:如果起点或终点没有公交车经过,那么无法到达,直接返回 -1

  3. 初始化队列和访问数组:使用一个队列来存储待访问的车站,以及一个数组来记录哪些公交车已经被访问过。

  4. 广度优先搜索:从起点开始,对每个经过起点的公交车进行搜索,找到所有可以到达的车站,并将这些车站加入队列。同时记录每个车站的最少乘坐公交车数量。

  5. 更新距离:对于队列中的每个车站,检查它是否是目标车站,如果是,则返回当前的乘坐公交车数量。如果不是,将其相邻的车站(即同一辆公交车上的其他车站)加入队列,并更新它们的乘坐公交车数量。

  6. 返回结果:如果队列被清空还没有找到目标车站,说明无法到达,返回 -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

代码实现

import java.util.*;

class Solution {
    public int numBusesToDestination(int[][] routes, int source, int target) {
        int n = routes.length; // 公交车数量
        if (source == target) return 0; // 如果起点和终点相同,不需要乘坐公交车

        // 建立车站到公交车的映射
        HashMap<Integer, List<Integer>> hm = new HashMap<>();
        for (int i = 0; i < n; i++) {
            for (int x : routes[i]) {
                hm.computeIfAbsent(x, k -> new ArrayList<>()).add(i);
            }
        }

        // 如果起点或终点没有公交车经过,无法到达
        if (!hm.containsKey(source) || !hm.containsKey(target)) return -1;

        // 初始化队列,用于广度优先搜索
        Queue<Integer> que = new ArrayDeque<>();
        boolean[] vis = new boolean[n]; // 记录公交车是否被访问过
        HashMap<Integer, Integer> dis = new HashMap<>(); // 记录每个车站的最少乘坐公交车数量
        dis.put(source, 0); // 起点的乘坐公交车数量为0
        que.offer(source);

        // 广度优先搜索
        while (!que.isEmpty()) {
            int x = que.poll();
            int disX = dis.get(x);
            for (int i : hm.get(x)) {
                if (!vis[i]) {
                    vis[i] = true; // 标记公交车为已访问
                    for (int y : routes[i]) {
                        // 如果这个车站没有被访问过,加入队列并更新距离
                        if (!dis.containsKey(y)) {
                            dis.put(y, disX + 1);
                            que.offer(y);
                        }
                    }
                }
            }
        }

        // 返回目标车站的最少乘坐公交车数量,如果无法到达则返回-1
        return dis.getOrDefault(target, -1);
    }
}

http://www.niftyadmin.cn/n/5664487.html

相关文章

Linux | 进程间通信:管道、消息队列、共享内存与信号量

文章目录 《深入理解进程间通信&#xff1a;管道、消息队列、共享内存与信号量》一、进程间通信介绍&#xff08;一&#xff09;进程间通信目的&#xff08;二&#xff09;进程间通信发展&#xff08;三&#xff09;进程间通信分类 二、管道&#xff08;一&#xff09;什么是管…

C++:字符串string转成整型int

一、atoi atoi 是 C 标准库中的一个函数&#xff0c;全称是 ASCII to Integer&#xff0c;用于将字符串转换为整数。 函数定义 int atoi(const char *str);参数&#xff1a;str 是一个指向以 \0 结尾的字符串的指针。返回值&#xff1a;返回字符串转换后的整数。如果字符串中…

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

如何看待IBM中国研发部裁员?

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; IBM中国研发部裁员及撤出背景分析 IBM&#xff08;International Business Machines&#xff09;作为全球科技巨头之一&#xff0c;其在中国市场的发展曾是中国信息技术产业的重要组成部分。近年来&#x…

图片转PDF技巧揭秘:四款高效工具推荐!

在数字化办公和学习的今天&#xff0c;将图片或其他文件格式转换为PDF已成为一种常见需求。以下是几款推荐的转换工具&#xff0c;它们各自具有独特的功能和使用体验&#xff0c;可帮助大家轻松实现图片转PDF及其他PDF相关操作。 福昕PDF转换大师&#xff08;365客户端&#x…

Yestar成都艺星引领行业星纪元:十大数字星品·高阶星技术震撼发布

近日&#xff0c;中国成都太古里Yestar十大数字星品高阶星技术AI科技3D Mapping全球发布会&#xff0c;震撼发布了十大数字星品高阶星技术升级&#xff0c;引领医美产业发展翻开崭新的一页。作为品牌成立19周年的庆典&#xff0c;这场科技与美学交融的盛会&#xff0c;标志着医…

AI绘画Stable Diffusion 自制素材工具: layerdiffusion插件—你的透明背景图片生成工具

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一款AI绘画的神级插件—LayerDiffusion。 Layerdiffusion是一个用于stable-diffusion-webui 的透明背景生成&#xff08;不是生成图再工具扣图&#xff0c;是直接生成透明背景透明图像&#xff09;插件扩展&#xff0c;它可…