2025-05-07 Daily Challenge
Today I have done leetcode's May LeetCoding Challenge with cpp
.
May LeetCoding Challenge 7
Description
Find Minimum Time to Reach Last Room I
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
Solution
class Solution {
using pi = pair<int, int>;
const int MOVES[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
public:
int minTimeToReach(vector<vector<int>>& moveTime) {
int rows = moveTime.size();
int cols = moveTime.front().size();
int target = rows * cols - 1;
priority_queue<pi, vector<pi>, greater<>> pq;
pq.push({0, 0});
set<int> visited;
while(pq.size()) {
auto [time, position] = pq.top();
pq.pop();
if(position == target) return time;
if(visited.count(position)) continue;
visited.insert(position);
int row = position / cols;
int col = position % cols;
for(int m = 0; m < 4; ++m) {
int newRow = row + MOVES[m][0];
int newCol = col + MOVES[m][1];
int newPos = newRow * cols + newCol;
if(newCol < 0 || newRow < 0 || newCol >= cols || newRow >= rows) continue;
if(visited.count(newPos)) continue;
pq.push({max(time + 1, moveTime[newRow][newCol] + 1), newPos});
}
}
return -1;
}
};
// Accepted
// 743/743 cases passed (44 ms)
// Your runtime beats 16.42 % of cpp submissions
// Your memory usage beats 28.64 % of cpp submissions (31 MB)