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

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

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<>();
        // ArrayDeque
        ArrayDeque<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.kler.cn/news/319644.html

相关文章:

  • 实验19:ds18b20温度实验
  • Unity屏幕震动效果
  • 「数学::质数」试除法 / Luogu P5736(C++)
  • 使用ChatGPT引导批判性思维,提升论文的逻辑与说服力的全过程
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 3 获取AAID
  • Python内置的re库
  • Android平台Unity3D下如何同时播放多路RTMP|RTSP流?
  • 什么是电商云手机?可以用来干什么?
  • 内容生态短缺,Rokid AR眼镜面临市场淘汰赛
  • 影刀RPA实战:网页爬虫之天猫商品数据
  • 在 Windows 上安装和配置 NVIDIA 驱动程序、CUDA、cuDNN 和 TensorRT
  • Vue2学习笔记(02条件渲染 、监视数据的原理)
  • JS面试真题 part6
  • 【C++】模拟实现list
  • WPF DataGrid 动态修改某一个单元格的样式
  • MyBatis 缓存机制
  • 【AI写作】解释区块链技术的应用场景和优势
  • select 函数简介
  • CentOS Linux教程(6)--CentOS目录
  • CSS的字体属性
  • 软件测试面试题(6)——二面(游戏测试)
  • 2024年_ChatGPT 及类似的人工智能技术带来的影响与改变 怎样利用 ChatGPT 提高学习效率
  • 在SpringBoot项目中利用Redission实现布隆过滤器(布隆过滤器的应用场景、布隆过滤器误判的情况、与位图相关的操作)
  • MICS:PythonJail沙箱逃逸(持续更新中)
  • Python数据分析与可视化:从基础到高级应用
  • vue3 实现图片预览组件
  • [ABC330E] Mex and Update
  • java-重启异常断掉的线程和监控线程状态
  • Android——Application
  • 网红挣钱太容易了