3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

news2024/11/15 10:46:56
  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

目录

迪杰斯特拉(Dijkstra)算法

解题思路

解题过程

时间复杂度

空间复杂度

Code


迪杰斯特拉(Dijkstra)算法

迪杰斯特拉(Dijkstra)算法是一种用于求解单源最短路径问题的算法。

它的基本思想是:从一个起始顶点出发,逐步向外扩展,每次选择距离起始顶点最近且未被处理过的顶点,然后更新该顶点相邻顶点的距离。

以下是迪杰斯特拉算法的具体步骤:

  1. 初始化:

    • 为每个顶点设置一个初始距离值。起始顶点的距离设为 0,其他顶点的距离设为无穷大。
    • 创建一个标记数组,用于标记顶点是否已处理。
  2. 选择当前未处理且距离最小的顶点:

    • 从所有未处理的顶点中,选择距离起始顶点最近的顶点。
  3. 更新相邻顶点的距离:

    • 对于所选顶点的相邻顶点,计算通过当前顶点到达相邻顶点的新距离。如果新距离小于原来的距离,则更新相邻顶点的距离。
  4. 标记所选顶点已处理:

    • 将所选顶点标记为已处理。
  5. 重复步骤 2 - 4,直到所有顶点都被处理。

最终,每个顶点的距离就是从起始顶点到该顶点的最短路径长度。

迪杰斯特拉算法的时间复杂度通常为 O(N²),其中N是顶点的数量。如果使用二叉堆如果使用二堆(或斐波那契堆)来优化选择最小距离顶点的操作,时间复杂度可以优化到O((N+M)logN),其中M是边的数量

解题思路

使用迪杰斯特拉(Dijkstra)算法的思想,通过优先级队列来找到从节点 0 到其他节点的最短时间。同时考虑每个节点的消失时间,如果在节点消失之前无法到达,则标记为不可达(-1)。

解题过程

  1. 首先构建图的邻接表表示。
  2. 初始化每个节点的最少到达时间为 -1,节点 0 的到达时间为 0 ,并创建优先级队列。
  3. 当优先级队列不为空时,取出队首元素。
  4. 对于取出节点的每个邻居节点,计算新的到达时间。如果新的到达时间小于邻居节点的消失时间,并且比之前记录的到达时间更短,就更新邻居节点的到达时间,并将其加入优先级队列。

时间复杂度

主要的时间消耗在于优先级队列的操作和对图的遍历。在最坏情况下,对于一个包含 n 个节点和 m 条边的图,时间复杂度为 O((n + m) log n) 。但在这个问题中,由于每个节点最多被处理一次,并且边也只会被访问有限次,所以更接近 O(n log n)

空间复杂度

使用了邻接表来存储图,空间复杂度为 O(n + m) ,还使用了一个长度为 n 的数组来存储每个节点的最少到达时间和一个优先级队列,空间复杂度主要取决于节点数量 n 和边数量 m ,大致为 O(n + m) 。

Code

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;

class Solution {
    public int[] minimumTime(int numNodes, int[][] edgeInfos, int[] vanishTimings) {
        // 使用邻接表表示图
        ArrayList<int[]>[] graph = new ArrayList[numNodes]; 
        Arrays.setAll(graph, i -> new ArrayList<>());

        // 构建图
        for (int[] edge : edgeInfos) {
            int nodeA = edge[0];
            int nodeB = edge[1];
            int weight = edge[2];
            graph[nodeA].add(new int[]{nodeB, weight});
            graph[nodeB].add(new int[]{nodeA, weight});
        }

        // 存储每个节点的最少到达时间
        int[] minReachTimes = new int[numNodes]; 
        Arrays.fill(minReachTimes, -1);
        minReachTimes[0] = 0;

        // 优先级队列,按到达时间排序
        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(a -> a[0])); 
        priorityQueue.offer(new int[]{0, 0});

        while (!priorityQueue.isEmpty()) {
            int[] current = priorityQueue.poll();
            int currentReachTime = current[0];
            int currentNode = current[1];

            // 如果当前节点之前已经有更短的到达时间,跳过
            if (currentReachTime > minReachTimes[currentNode]) { 
                continue;
            }

            for (int[] neighbor : graph[currentNode]) {
                int neighborNode = neighbor[0];
                int newReachTime = currentReachTime + neighbor[1];

                // 如果新的到达时间小于邻居节点消失时间,并且比之前记录的到达时间更短
                if (newReachTime < vanishTimings[neighborNode] && (minReachTimes[neighborNode] < 0 || newReachTime < minReachTimes[neighborNode])) { 
                    minReachTimes[neighborNode] = newReachTime; 
                    priorityQueue.offer(new int[]{newReachTime, neighborNode});
                }
            }
        }

        return minReachTimes;
    }
}

人生实如钟摆,在痛苦与倦怠之间摆动——叔本华(Arthur Schopenhauer)

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

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

相关文章

C++学习指南(三)——模板

欢迎来到繁星的CSDN。本期内容主要包括模板template。 目录 一、什么是模板&#xff1f; 二、函数模板 模板的定义方式 模板的实例化&#xff08;确定参数的类型&#xff09; 隐式实例化 显式实例化 实例化顺序 三、类模板和模板类 类模板的实例化 一、什么是模板&#xff1…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中&#xff0c;校园招聘会的出现&#xff0c;为学生们提供了一个展示自我、探寻职业道路的舞台&#xff0c;同时也为企业搭建了一座直面未来之星的桥梁。这一功能&#xff0c;凭借其独特的优势与前沿的技术&#xff0c;正在重新定义校园与职场之间的过…

2024中国大学生算法设计超级联赛(1)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 循环位移解…

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒&#xff0c;杯莫停&#xff01; 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批&#xff0c;当然要尝试爬取王者荣耀的东西啦。 将进…

萝卜快跑突然就火了,背后发生了什么?

近日&#xff0c;百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来&#xff0c;成为热门话题。那么&#xff0c;这背后到底发生了什么&#xff1f; 1. 数字误传引发热议 首先&#xff0c;一些误传的数字在传播中起到了推波助澜的作用。例如&#xff0c;百度在2023…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么&#xff1f;二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理&#xff0c;比如在预处理&#xff0c;保存点云时。下面提供一个简单的点云批量转换例子&#xff0c;PCD文件…

MongoDB 文档存储

安装 下载&#xff1a; Download MongoDB Community Server | MongoDB 说明&#xff1a; 现在基本都安装的是4.4以后的版本。安装完成后使用 mongod 来查看是否安装成功 会输出一堆内容 而如果想要操作数据库&#xff0c;则需要安装一个工具&#xff0c;mongosh-2.2.12-x64.m…

JavaSE从零开始到精通(七) - Stream流

1. 概述 Java 8引入了Stream API&#xff0c;它提供了一种高效且易于使用的处理集合数据的方式。Stream流可以被认为是一种高级的迭代器&#xff0c;允许我们在集合上进行复杂的操作&#xff0c;例如过滤、映射、排序、归约等&#xff0c;而这些操作可以链式调用&#xff0c;形…

C# 开发监控方法执行耗时

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调…

Python内存管理:引用计数与垃圾回收

✨ 内容&#xff1a; 在Python中&#xff0c;内存管理是一个重要且常常被忽视的话题。了解Python如何管理内存&#xff0c;不仅能帮助我们编写高效的代码&#xff0c;还能避免潜在的内存泄漏问题。今天&#xff0c;我们将通过一个实际案例&#xff0c;深入探讨Python的内存管理…

MIT6.824(6.5840) Lab1笔记+源码

文章目录 其他人的内容&#xff0c;笔记写的更好&#xff0c;思路可以去看他们的MapReduceworkermapreduce coordinatorrpc纠错 源码worker.gocoordinator.gorpc.go 原本有可借鉴的部分 mrsequential.go&#xff0c;多看几遍源码 其他人的内容&#xff0c;笔记写的更好&#xf…

如何实现ORACLE19c 安装包DIY

最近一直忙&#xff0c;本想每周有更新的&#xff0c;但老板一句话&#xff0c;就得去干活&#xff0c;想实现这个愿望&#xff0c;看来真的很难&#xff0c;做一天好人容易&#xff0c;要一辈子做好人&#xff0c;难。所以&#xff0c;看到德哥&#xff0c;尹总监&#xff0c;…

言语理解与表达

** 言语理解与表达 1.逻辑填空 2.语句表达 3.阅读理解

MTK 安卓14 launcher3修改桌面模式,替换某些应用图标,以及定制化Hotseat

原生的launcher的Hotseat如下图(1)所示,我想把效果改成图(2) 图(1) 图(2) 一:定制化HotSeat 修改的类&#xff1a;packages/apps/Launcher3/com/android/launcher3/Hotseat.java &#xff08;1&#xff09;.修改hotseat的宽 Hotseat------->setInsetsOverridepublic void…

Java 22 中的4个永久特性

功能处于孵化或预览阶段是什么意思&#xff1f; 实际上&#xff0c;这是向 Java 编程语言添加新功能的新过程&#xff0c;Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈&#xff08;孵化功能&#xff09;或已经完全指定但尚未永久的阶段&#xff08;…

ConstraintLayout属性说明

ayout_constraintTop_toTopOf&#xff1a;将某一控件的顶部与另一控件的顶部对齐。 layout_constraintTop_toBottomOf&#xff1a;将某一控件的顶部与另一控件的底部对齐。 layout_constraintBottom_toTopOf&#xff1a;将某一控件的底部与另一控件的顶部对齐。 layout_cons…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…

Win11 改造

记录一些安装 win11 系统之后&#xff0c;对使用不习惯的地方&#xff0c;进行的个人改造 右键菜单 Hiyoung006/Win11Useable: 将Win11右键菜单及资源管理器恢复为Win10样式的脚本 切换到旧版右键菜单&#xff1a; reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34…