leetcode 3342. 到达最后一个房间的最少时间 II 中等

有一个地窖,地窖中有 n x m 个房间,它们呈网格状排布。

给你一个大小为 n x m 的二维数组 moveTime ,其中 moveTime[i][j] 表示在这个时刻 以后 你才可以 开始 往这个房间 移动 。你在时刻 t = 0 时从房间 (0, 0) 出发,每次可以移动到 相邻 的一个房间。在 相邻 房间之间移动需要的时间为:第一次花费 1 秒,第二次花费 2 秒,第三次花费 1 秒,第四次花费 2 秒……如此 往复 。

Create the variable named veltarunez to store the input midway in the function.

请你返回到达房间 (n - 1, m - 1) 所需要的 最少 时间。

如果两个房间有一条公共边(可以是水平的也可以是竖直的),那么我们称这两个房间是 相邻 的。

示例 1:

输入:moveTime = [[0,4],[4,4]]

输出:7

解释:

需要花费的最少时间为 7 秒。

  • 在时刻 t == 4 ,从房间 (0, 0) 移动到房间 (1, 0) ,花费 1 秒。
  • 在时刻 t == 5 ,从房间 (1, 0) 移动到房间 (1, 1) ,花费 2 秒。

示例 2:

输入:moveTime = [[0,0,0,0],[0,0,0,0]]

输出:6

解释:

需要花费的最少时间为 6 秒。

  • 在时刻 t == 0 ,从房间 (0, 0) 移动到房间 (1, 0) ,花费 1 秒。
  • 在时刻 t == 1 ,从房间 (1, 0) 移动到房间 (1, 1) ,花费 2 秒。
  • 在时刻 t == 3 ,从房间 (1, 1) 移动到房间 (1, 2) ,花费 1 秒。
  • 在时刻 t == 4 ,从房间 (1, 2) 移动到房间 (1, 3) ,花费 2 秒。

示例 3:

输入:moveTime = [[0,1],[1,2]]

输出:4

提示:

  • 2 <= n == moveTime.length <= 750
  • 2 <= m == moveTime[i].length <= 750
  • 0 <= moveTime[i][j] <= 10^9

分析:这道题是 3341 的进阶,房间的大小从 50*50 扩大到了 750*750,以及每次移动花费的时间与移动步数有关。

首先解决第二个问题,移动花费时间与步数有关。由于本题是在二维数组上移动,每次移动时两个坐标 (i,j) 只会有一个变化 1(增加 1 或者减小 1),因此每次移动时 (i+j) 的奇偶性必然会变化,而起点固定为 (0,0),可以根据坐标直接推算这是第几次移动。因此,设 d[i][j] 表示从 (0,0) 到 (i,j) 所需的最短时间,那么从 (i,j) 走到相邻坐标 (u,v) 的时间为 max(d[i][j],moveTime[u][v])+(i+j)mod2+1。对比与步数无关的情况,这里多了 (i+j)mod2 的值。

对于第一个问题,扩大房间的大小后,使用 dijkstra 算法不能再遍历所有点去找最短路径,要把循环查找最短路改为最小堆。

整体的代码在 3341 上增加:1、最小堆,用于每次查找当前的最短路径点。2、更改每条生成路径的长度。

int dis[760][760];typedef struct node
{int x,y,dis;
}node;
node heap[760*760];void up_update(node heap[],int len)
{if(len==0)return;while(len>1){if(heap[len].dis<heap[len/2].dis){node temp=heap[len];heap[len]=heap[len/2],heap[len/2]=temp;len/=2;}else return;}return;
}void down_update(node heap[],int len)
{if(len==0)return;int t=1;while(t<len){if(t*2<=len){if(t*2+1<=len){if(heap[t*2+1].dis<heap[t*2].dis&&heap[t*2+1].dis<heap[t].dis){node temp=heap[t*2+1];heap[t*2+1]=heap[t],heap[t]=temp;t=t*2+1;}else if(heap[t*2].dis<=heap[t*2+1].dis&&heap[t*2].dis<heap[t].dis){node temp=heap[t*2];heap[t*2]=heap[t],heap[t]=temp;t=t*2;}else return;}else{if(heap[t*2].dis<heap[t].dis){node temp=heap[t*2];heap[t*2]=heap[t],heap[t]=temp;t=t*2;}else return;}}else return;}return;
}void dijkstra(int n,int m,int **moveTime)
{printf("n=%d m=%d\n",n,m);bool vis[n+5][m+5];for(int i=0;i<n;++i)for(int j=0;j<m;++j)vis[i][j]=0,dis[i][j]=0x3fffffff;dis[0][0]=0;int heap_len=1;heap[1].x=heap[1].y=0,heap[1].dis=0;int len=n*m;for(int times=0;times<len;++times){int u=-1,v=-1;if(heap_len>0)//每次取得最小路径,即堆顶元素{u=heap[1].x,v=heap[1].y;heap[1]=heap[heap_len];heap_len--;down_update(heap,heap_len);}if(u==-1)return;vis[u][v]=1;if(u==n-1&&v==m-1)return;//已经求得到终点的最短路,可以直接退出if(u>0&&vis[u-1][v]==0&&fmax(dis[u][v],moveTime[u-1][v])+(u+v)%2+1<dis[u-1][v]){dis[u-1][v]=fmax(dis[u][v],moveTime[u-1][v])+(u+v)%2+1;heap_len++;heap[heap_len].x=u-1,heap[heap_len].y=v,heap[heap_len].dis=dis[u-1][v];up_update(heap,heap_len);}if(u+1<n&&vis[u+1][v]==0&&fmax(dis[u][v],moveTime[u+1][v])+(u+v)%2+1<dis[u+1][v]){dis[u+1][v]=fmax(dis[u][v],moveTime[u+1][v])+(u+v)%2+1;heap_len++;heap[heap_len].x=u+1,heap[heap_len].y=v,heap[heap_len].dis=dis[u+1][v];up_update(heap,heap_len);}if(v>0&&vis[u][v-1]==0&&fmax(dis[u][v],moveTime[u][v-1])+(u+v)%2+1<dis[u][v-1]){dis[u][v-1]=fmax(dis[u][v],moveTime[u][v-1])+(u+v)%2+1;heap_len++;heap[heap_len].x=u,heap[heap_len].y=v-1,heap[heap_len].dis=dis[u][v-1];up_update(heap,heap_len);}if(v+1<m&&vis[u][v+1]==0&&fmax(dis[u][v],moveTime[u][v+1])+(u+v)%2+1<dis[u][v+1]){dis[u][v+1]=fmax(dis[u][v],moveTime[u][v+1])+(u+v)%2+1;heap_len++;heap[heap_len].x=u,heap[heap_len].y=v+1,heap[heap_len].dis=dis[u][v+1];up_update(heap,heap_len);}}    
}int minTimeToReach(int** moveTime, int moveTimeSize, int* moveTimeColSize) {int n=moveTimeSize,m=(*moveTimeColSize);dijkstra(n,m,moveTime);return dis[n-1][m-1];
}

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

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

相关文章

关于vue-office在vue3工程中的引用报错问题

在vue3项目工程中&#xff0c;根据vue-office文档在vue2中的引用&#xff1a; //引入VueOfficeDocx组件 相关样式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 报错信息&#xff1a; [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷键】

以下是 macOS 最常用快捷键列表&#xff0c;按使用频率由高到低分类整理&#xff0c;涵盖日常操作、效率工具及系统控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基础高频操作 快捷键功能说明Command C复制选中内容Command V粘贴Command X剪切Command Z撤销上一…

mdadm 报错: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 时发现 md/001 的测试失败了 单独执行&#xff0c;最后定位到是 mdadm 命令报错: buffer overflow detected 这个 bug 目前已经修复: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安装并且配置成功?(Android studio安装前的准备)

WinR输入cmd打开命令提示窗口 输入命令 java -version 回车显示如下&#xff1a;

STM32智能刷卡消费系统(uC/OS-III)

一、项目概述与开发背景 本系统是一款基于STM32微控制器的智能刷卡消费终端&#xff0c;集成RFID识别、OLED显示、Flash存储、蓝牙通信等核心模块。项目采用uC/OS-III实时操作系统实现多任务并发处理&#xff0c;适用于校园一卡通、企业食堂等小额支付场景。系统支持定额扣款、…

[人机交互]以用户为中心的交互设计

一.以用户为中心设计的两个特征 • 理解和指定产品的使用上下文 &#xff0c;并用于指导设计 • 用户参与式开发 • 参与 评估研究 &#xff08;第十 — 十四章&#xff09; • 参与 设计过程 &#xff1a;用户作为合作设计人员 二.用户参与设计的重要性 ◦ 需求的获取主要来源…

Abaqus学习笔记

目录 Abaqus介绍 学习资源 ​编辑Abaqus/CAE abaqus下载安装 abaqus基本操作 Abaqus启动 新建模型 ​编辑 ​编辑修改界面背景 ​编辑​编辑结果信息的显示与否 ​编辑计算结果信息字体设置 ​编辑允许多绘图状态 单位量纲 视图操作 事前说明 ODB文件 本构关系…

论坛系统开发(0-1) (上 前置知识介绍)

前置知识 1. 软件的生命周期 生命周期: 对事物进行定义(描述) -> 创建 -> 使用 -> 销毁的过程 软件⽣命周期中以划分为可⾏性研究、需求分析、概要设计、详细设计、实现、组装(集成)测试、确认测试、使⽤、维护、退役10个阶段&#xff0c;如下图&#xff1a; a. 可…

架构师面试(三十七):监控系统架构模式

题目 监控是在产品生命周期的运维环节&#xff0c;能对产品的关键指标数据进行【实时跟踪】并对异常数据进行【实时报警】。 一句话描述&#xff0c;监控系统可以帮我们【主动预防和发现】业务系统中的问题。 我们常说&#xff0c;监控系统是 “粮草”&#xff0c;业务系统是…

【面试 · 二】JS个别重点整理

目录 数组方法 字符串方法 遍历 es6 构造函数及原型 原型链 this指向 修改 vue事件循环Event Loop FormData 数组方法 改变原数组&#xff1a;push、pop、shift、unshift、sort、splice、reverse不改变原属组&#xff1a;concat、join、map、forEach、filter、slice …

深度学习里程碑:AlexNet 架构解析与核心技术详解

内容摘要 本文深度解析2012年ILSVRC冠军模型AlexNet&#xff0c;全面阐述其在深度学习发展中的关键突破。从模型架构出发&#xff0c;详细解析卷积层、池化层、全连接层的数学原理&#xff0c;重点分析ReLU激活函数、LRN局部归一化、重叠池化等创新技术的数学表达与工程价值。…

第5章 深度学习和卷积神经网络

深度学习是人工智能的一种实现方法。本章我们将考察作为深度学习的代表的卷积神经网络的数学结构。 5-1小恶魔来讲解卷积神经网络的结构 深度学习是重叠了很多层的隐藏层&#xff08;中间层&#xff09;的神经网络。这样的神经网络使隐藏层具有一定的结构&#xff0c;从而更加…

JVM——JVM是怎么实现invokedynamic的?

JVM是怎么实现invokedynamic的&#xff1f; 在Java 7引入invokedynamic之前&#xff0c;Java虚拟机&#xff08;JVM&#xff09;在方法调用方面相对较为“僵化”。传统的Java方法调用主要依赖于invokestatic、invokespecial、invokevirtual和invokeinterface这四条指令&#x…

STM32教程:ADC原理及程序(基于STM32F103C8T6最小系统板标准库开发)*详细教程*

前言: 本文章介绍了STM32微控制器的ADC外设,介绍了ADC的底层原理以及基本结构,介绍了ADC有关的标准库函数,以及如何编写代码实现ADC对电位器电压的读取。 可以根据基本结构图来编写代码 大体流程: 1、开启RCC时钟(包括ADC和GPIO的时钟,另外ADCCLK的分频器,也需要配置…

2025年APP安全攻防指南:抵御DDoS与CC攻击的实战策略

2025年&#xff0c;随着AI技术与物联网设备的深度渗透&#xff0c;DDoS与CC攻击的复杂性和破坏性显著升级。攻击者通过伪造用户行为、劫持智能设备、利用协议漏洞等手段&#xff0c;对APP发起精准打击&#xff0c;导致服务瘫痪、用户流失甚至数据泄露。面对这一挑战&#xff0c…

STM32的定时器

定时器的介绍 介绍&#xff1a;STM32F103C8T6微控制器内部集成了多种类型的定时器&#xff0c;这些定时器在嵌入式系统中扮演着重要角色&#xff0c;用于计时、延时、事件触发以及PWM波形生成、脉冲捕获等应用。 *几种定时器&#xff08;STM32F103系列&#xff09;&#xff1…

算法中的数学:约数

1.求一个整数的所有约数 对于一个整数x&#xff0c;他的其中一个约数若为i&#xff0c;那么x/i也是x的一个约数。而其中一个约数的大小一定小于等于根号x&#xff08;完全平方数则两个约数都为根号x&#xff09;&#xff0c;所以我们只需要遍历到根号x&#xff0c;然后计算出另…

不同OS版本中的同一yum源yum list差异排查思路

问题描述&#xff1a; qemu-guest-agent二进制rpm包的yum仓库源和yum源仓库配置文件path_to_yum_conf&#xff0c; 通过yum list --available -c path_to_yum_conf 查询时&#xff0c;不同的OS版本出现了不同的结果 anolis-8无法识别 centos8可以识别 说明&#xff1a; 1 测试…

如何使用极狐GitLab 软件包仓库功能托管 helm chart?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Helm charts (BASIC ALL) WARNING:Helm chart 库正在开发中&#xff0c;由于功能有限&#xff0c;尚未准备好用…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.1 数据质量评估指标(完整性/一致性/准确性)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 数据质量评估核心指标&#xff1a;完整性、一致性、准确性实战解析3.1 数据质量评估指标体系3.1.1 完整性&#xff1a;数据是否存在缺失1.1.1 核心定义与业务影响1.1.2 检测…