LeetCode 网络延迟时间 - Dijkstra 算法

2024-04-14 03:36

本文主要是介绍LeetCode 网络延迟时间 - Dijkstra 算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络延迟时间- Dijkstra的算法

function networkDelayTime(times: number[][], n: number, k: number): number {const adjList:Record<string, [number,number, number][]> = {};for(let i = 0; i < times.length; i++) {if(!adjList[times[i][0]]){adjList[times[i][0]] = [[times[i][0], times[i][1], times[i][2]]];}else {adjList[times[i][0]].push([times[i][0], times[i][1], times[i][2]]);}}const minTimes = Array(n+1).fill(Infinity);minTimes[k] = 0;const minHeap = new MinHeap();const edges = adjList[String(k)];if(!edges) return -1;for(let i = 0; i < edges.length; i++)minHeap.add(edges[i]); while(!minHeap.isEmpty()){const [source, target, time] = minHeap.pop();if(minTimes[target] > minTimes[source] + time) {minTimes[target] = minTimes[source] + time;const edges = adjList[target];if(!edges) continue;for(let i = 0; i< edges.length; i++) {minHeap.add(edges[i]);}}}let max = 0;for(let i = 1; i < minTimes.length; i++) {if(minTimes[i] === Infinity)return -1;else if(max < minTimes[i])max = minTimes[i];}return max;
};class MinHeap {private arr:[number,number,number][] = [];isEmpty():boolean {return this.arr.length === 0;}add(e:[number,number,number]){this.arr.push(e);let curI = this.arr.length - 1, parentI = this.getParentI(curI);while(curI > 0 && this.arr[curI][2] < this.arr[parentI][2]){this.swap(curI, parentI);curI = parentI;parentI =  this.getParentI(curI);}}pop():[number,number,number]{const retE = this.arr[0];const last = this.arr.pop();if(this.arr.length === 0) return retE;this.arr[0] = last;let curI = 0, leftChildI = this.getLeftChildI(curI), rightChildI = this.getRightChildI(curI);while((leftChildI < this.arr.length && this.arr[leftChildI][2] < this.arr[curI][2])|| (rightChildI < this.arr.length && this.arr[rightChildI][2] < this.arr[curI][2])) {const smallerChildI = (rightChildI >= this.arr.length || this.arr[rightChildI][2] > this.arr[leftChildI][2])? leftChildI : rightChildI;this.swap(smallerChildI, curI);curI = smallerChildI;leftChildI  = this.getLeftChildI(curI);rightChildI = this.getRightChildI(curI);}return retE;}private swap(i:number, j:number) {const temp = this.arr[i];this.arr[i] = this.arr[j];this.arr[j] = temp;}private getParentI(i:number) {return Math.floor((i - 1)/2);}private getLeftChildI(i:number) {return 2*i + 1;}private getRightChildI(i:number) {return 2*i + 2;}
}

Dijkstra的算法通过迭代更新到每个节点的最短路径来起作用。从源节点开始,它考虑了所有传出边缘,并将最短的边缘添加到路径中。考虑到所有外向的边缘,每个新添加的节点都重复此过程。如果发现较短的路径到节点,则该算法会更新路径长度。这一直持续到所有节点都被考虑为止。

这是实施的概述:

  1. 初始化 minTimes 数组存储到达每个节点的最短时间,将所有元素设置为 Infinity ,除了设置为源节点 0
  2. 将所有源自源节点的边缘推入一个分钟-堆。
  3. 弹出最短的边缘-堆并考虑其目标节点。如果通过此边缘到目标节点的路径比当前路径短,请更新时间 minTimes 并将所有源自目标节点的边缘添加到最小值-堆。
  4. 重复步骤3直到最小-堆是空的。
  5. 迭代 minTimes 数组以找到最大值。如果保留任何元素 Infinity ,这表明相应的节点是无法到达的,所以返回-1。
  6. 返回最大值,表示达到最远节点所需的时间。

这篇关于LeetCode 网络延迟时间 - Dijkstra 算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901980

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n