LeetCode 3341. Find Minimum Time to Reach Last Room I

原题链接在这里:https://leetcode.com/problems/find-minimum-time-to-reach-last-room-i/description/

题目:

There is a dungeon with n x m rooms arranged as a grid.

You are given a 2D array moveTime of size n x m, where moveTime[i][j] represents the minimum time in seconds when you can start moving to that room. You start from the room (0, 0) at time t = 0 and can move to an adjacent room. Moving between adjacent rooms takes exactly one second.

Return the minimum time to reach the room (n - 1, m - 1).

Two rooms are adjacent if they share a common wall, either horizontally or vertically.

Example 1:

Input: moveTime = [[0,4],[4,4]]

Output: 6

Explanation:

The minimum time required is 6 seconds.

  • At time t == 4, move from room (0, 0) to room (1, 0) in one second.
  • At time t == 5, move from room (1, 0) to room (1, 1) in one second.

Example 2:

Input: moveTime = [[0,0,0],[0,0,0]]

Output: 3

Explanation:

The minimum time required is 3 seconds.

  • At time t == 0, move from room (0, 0) to room (1, 0) in one second.
  • At time t == 1, move from room (1, 0) to room (1, 1) in one second.
  • At time t == 2, move from room (1, 1) to room (1, 2) in one second.

Example 3:

Input: moveTime = [[0,1],[1,2]]

Output: 3

Constraints:

  • 2 <= n == moveTime.length <= 50
  • 2 <= m == moveTime[i].length <= 50
  • 0 <= moveTime[i][j] <= 109

题解:

To find the minimum time, we can think of using BFS. But here, we need to sort based the arriveTime, thus we use minHeap.

In the minHeap, we need to maintain the currrent coordinates x, y and time.

We also need a 2D array dp to track the minimum time to arrive at each coordinates.

If we reach the last room, return the current time.

Otherwise, we use current time + wait time + 1 and check if it is smaller than the dp arriveTime. If yes, update dp arriveTime and add to the queue.

Time Complexity: O(mnlogmn). m = moveTime.length. n = moveTime[0].length.

Space: O(mn).

AC Java:

复制代码
 1 class Solution {
 2     public int minTimeToReach(int[][] moveTime) {
 3         if(moveTime == null || moveTime.length == 0 || moveTime[0].length == 0){
 4             return -1;
 5         }
 6 
 7         int m = moveTime.length;
 8         int n = moveTime[0].length;
 9         int[][] dp = new int[m][n];
10         for(int i = 0; i < m; i++){
11             Arrays.fill(dp[i], Integer.MAX_VALUE);
12         }
13 
14         PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> a[2] - b[2]);
15         dp[0][0] = 0;
16         minHeap.add(new int[]{0, 0, 0});
17         int[][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
18         while(!minHeap.isEmpty()){
19             int[] cur = minHeap.poll();
20             if(cur[0] == m - 1 && cur[1] == n - 1){
21                 return cur[2];
22             }
23 
24             for(int[] dir : dirs){
25                 int x = cur[0] + dir[0];
26                 int y = cur[1] + dir[1];
27                 if(x < 0 || x >= m || y < 0 || y >= n){
28                     continue;
29                 }
30 
31                 int waitTime = Math.max(0, moveTime[x][y] - cur[2]);
32                 int arriveTime = cur[2] + 1 + waitTime;
33                 if(arriveTime < dp[x][y]){
34                     dp[x][y] = arriveTime;
35                     minHeap.add(new int[]{x, y, arriveTime});
36                 }
37             }
38         }
39 
40         return -1;
41     }
42 }
复制代码

 

posted @   Dylan_Java_NYC  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2019-11-13 LeetCode 677. Map Sum Pairs
2019-11-13 LeetCode 676. Implement Magic Dictionary
2017-11-13 LeetCode 648. Replace Words
2015-11-13 LeetCode 304. Range Sum Query 2D - Immutable
2015-11-13 LeetCode 303. Range Sum Query - Immutable
2015-11-13 LeetCode 301. Remove Invalid Parentheses
点击右上角即可分享
微信分享提示