2577。访问网格中的单元格的最短时间
难度:难
主题:数组、广度优先搜索、图、堆(优先级队列)、矩阵、最短路径
给定一个 m x n 矩阵网格,由 非负 整数组成,其中 grid[row][col] 表示能够访问单元格所需的 最短 时间(行、 col),表示只有访问单元格(row, col)的时间大于等于grid[row][col],才能访问该单元格。
您在第 0 秒站在矩阵的 左上角 单元格中,并且您必须移动到四个中任何 相邻单元格方向:上、下、左、右。你的每一个动作都需要 1 秒。
返回访问矩阵右下单元格所需的最短时间。如果无法访问右下角的单元格,则返回 -1.
示例1:
- 输入: grid = [[0,1,3,2],[5,1,2,5],[4,3,8,6]]
- 输出: 7
-
说明:我们可以采取的路径之一如下:
- 在 t = 0 时,我们位于单元 (0,0) 上。
- 在 t = 1 时,我们移动到单元格 (0,1)。这是可能的,因为 grid[0][1]
- 在 t = 2 时,我们移动到单元格 (1,1)。这是可能的,因为 grid[1][1]
- 在 t = 3 时,我们移动到单元格 (1,2)。这是可能的,因为 grid[1][2]
- 在 t = 4 时,我们移动到单元格 (1,1)。这是可能的,因为 grid[1][1]
- 在 t = 5 时,我们移动到单元格 (1,2)。这是可能的,因为 grid[1][2]
- 在 t = 6 时,我们移动到单元格 (1,3)。这是可能的,因为 grid[1][3]
- 在 t = 7 时,我们移动到单元格 (2,3)。这是可能的,因为 grid[2][3]
- 最终时间是7。可以证明这是可能的最短时间。
示例2:
- 输入: grid = [[0,2,4],[3,2,1],[1,0,4]]
- 输出: -1
- 解释:没有从左上角到右下角单元格的路径。
约束:
- m == grid.length
- n == grid[i].length
- 2
- 4 sup>5
- 0 sup>5
- 网格[0][0] == 0
提示:
- 尝试使用某种算法来找到图表上的最短路径。
- 考虑这样的情况:您必须在矩阵的两个单元之间来回移动才能解锁其他一些单元。
解决方案:
我们可以使用优先级队列应用Dijkstra算法的修改版本。这个问题本质上要求我们找到从左上角单元格访问右下角单元格所需的最短时间,其中每次移动都有基于网格中的值的时间限制。
方法:
图形表示:将网格中的每个单元格视为一个节点。边缘是您可以移动到的相邻单元格(上、下、左、右)。
优先级队列(最小堆):使用优先级队列始终以最少的时间探索单元。这确保我们按照最早到达细胞的顺序处理细胞。
修改后的 BFS:对于每个单元格,我们将检查是否可以移动到其相邻单元格并更新我们可以访问它们的时间。如果某个单元格在比当前时间晚的时间被访问,我们将使用新时间将其添加回队列中。
提前退出:一旦到达右下角的单元格,我们就可以返回时间。如果我们耗尽队列但未到达,则返回 -1。
让我们用 PHP 实现这个解决方案:2577。访问网格中的单元格的最短时间
<?php /** * @param Integer[][] $grid * @return Integer */ function minimumTime($grid) { ... ... ... /** * go to ./solution.php */ } // Example 1 $grid1 = [ [0, 1, 3, 2], [5, 1, 2, 5], [4, 3, 8, 6] ]; echo minimumTime($grid1) . PHP_EOL; // Output: 7 // Example 2 $grid2 = [ [0, 2, 4], [3, 2, 1], [1, 0, 4] ]; echo minimumTime($grid2) . PHP_EOL; // Output: -1 ?>
解释:
优先队列:
SplPriorityQueue 用于确保首先处理时间最短的单元。优先级存储为 -time,因为 PHP 的 SplPriorityQueue 默认是最大堆。遍历:
从左上角的单元格 (0, 0) 开始,算法处理所有可到达的单元格,考虑每个单元格可以被访问的最早时间 (max(0, grid[newRow][newCol] - (time 1)))。访问的单元格:
访问过的数组会跟踪已经处理过的单元格,以避免冗余计算和无限循环。边界和有效性检查:
该算法确保我们保持在网格范围内并仅处理有效的邻居。时间计算:
每次移动需要一秒钟,如果单元格需要等待(即 grid[newRow][newCol] > 时间 1),算法会等待,直到所需的时间。边缘案例:
如果队列已耗尽且未到达右下单元格,则函数返回 -1。
复杂性分析
-
时间复杂度:
- 每个单元最多添加到优先级队列一次:O(m x n x log(m x n)),其中 m和 n 是网格尺寸。
-
空间复杂度:
- 优先级队列和访问数组的空间为O(m x n).
运行示例
输入:
<?php /** * @param Integer[][] $grid * @return Integer */ function minimumTime($grid) { ... ... ... /** * go to ./solution.php */ } // Example 1 $grid1 = [ [0, 1, 3, 2], [5, 1, 2, 5], [4, 3, 8, 6] ]; echo minimumTime($grid1) . PHP_EOL; // Output: 7 // Example 2 $grid2 = [ [0, 2, 4], [3, 2, 1], [1, 0, 4] ]; echo minimumTime($grid2) . PHP_EOL; // Output: -1 ?>
输入:
$grid = [ [0, 1, 3, 2], [5, 1, 2, 5], [4, 3, 8, 6] ]; echo minimumTime($grid); // Output: 7
这个解决方案非常高效,并且在限制范围内运行良好。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
- 领英
- GitHub
以上是访问网格中的单元的最短时间的详细内容。更多信息请关注PHP中文网其他相关文章!

TOOPTIMIZEPHPCODEFORDUSEMEMORYUSAGEAGEAGEAGEAGEAGEANDEXECUTITIEM,关注台词:1)USEREEREFERESCENCENCINCOPYINSTEADOFCOPYINGINATATASTRUCTURESTROUCTURESTOREDUCEMORYCONSUMPTION.2)杠杆phphppphpphp'sbuilt intimpunctionslikearray_mapforfunctionslikearray_mapforfforfforfforfasterapasterexecution.3)

phpisusedforsendendemailsduetoitsignegrationwithservermailservicesand andexternalsmtpproviders,自动化notifications andMarketingCampaigns.1)设置设置yourphpenvironcormentswironmentswithaweberswithawebserverserverserverandphp,确保themailfunctionisenabled.2)useabasicscruct

发送电子邮件的最佳方法是使用PHPMailer库。1)使用mail()函数简单但不可靠,可能导致邮件进入垃圾邮件或无法送达。2)PHPMailer提供更好的控制和可靠性,支持HTML邮件、附件和SMTP认证。3)确保正确配置SMTP设置并使用加密(如STARTTLS或SSL/TLS)以增强安全性。4)对于大量邮件,考虑使用邮件队列系统来优化性能。

CustomHeadersheadersandAdvancedFeaturesInphpeMailenHanceFunctionalityAndreliability.1)CustomHeadersheadersheadersaddmetadatatatatataatafortrackingandCategorization.2)htmlemailsallowformattingandttinganditive.3)attachmentscanmentscanmentscanbesmentscanbestmentscanbesentscanbesentingslibrarieslibrarieslibrariesliblarikelikephpmailer.4)smtppapapairatienticationaltication enterticationallimpr

使用PHP和SMTP发送邮件可以通过PHPMailer库实现。1)安装并配置PHPMailer,2)设置SMTP服务器细节,3)定义邮件内容,4)发送邮件并处理错误。使用此方法可以确保邮件的可靠性和安全性。

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

使用依赖注入(DI)的原因是它促进了代码的松耦合、可测试性和可维护性。1)使用构造函数注入依赖,2)避免使用服务定位器,3)利用依赖注入容器管理依赖,4)通过注入依赖提高测试性,5)避免过度注入依赖,6)考虑DI对性能的影响。

phperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovesponsemetimes.2)优化


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。