2024-11-29 Daily Challenge
Today I have done leetcode's November LeetCoding Challenge with cpp
.
November LeetCoding Challenge 29
Description
Minimum Time to Visit a Cell In a Grid
You are given a m x n
matrix grid
consisting of non-negative integers where grid[row][col]
represents the minimum time required to be able to visit the cell (row, col)
, which means you can visit the cell (row, col)
only when the time you visit it is greater than or equal to grid[row][col]
.
You are standing in the top-left cell of the matrix in the 0th
second, and you must move to any adjacent cell in the four directions: up, down, left, and right. Each move you make takes 1 second.
Return the minimum time required in which you can visit the bottom-right cell of the matrix. If you cannot visit the bottom-right cell, then return -1
.
Example 1:
Input: grid = [[0,1,3,2],[5,1,2,5],[4,3,8,6]] Output: 7 Explanation: One of the paths that we can take is the following: - at t = 0, we are on the cell (0,0). - at t = 1, we move to the cell (0,1). It is possible because grid[0][1] <= 1. - at t = 2, we move to the cell (1,1). It is possible because grid[1][1] <= 2. - at t = 3, we move to the cell (1,2). It is possible because grid[1][2] <= 3. - at t = 4, we move to the cell (1,1). It is possible because grid[1][1] <= 4. - at t = 5, we move to the cell (1,2). It is possible because grid[1][2] <= 5. - at t = 6, we move to the cell (1,3). It is possible because grid[1][3] <= 6. - at t = 7, we move to the cell (2,3). It is possible because grid[2][3] <= 7. The final time is 7. It can be shown that it is the minimum time possible.
Example 2:
Input: grid = [[0,2,4],[3,2,1],[1,0,4]] Output: -1 Explanation: There is no path from the top left to the bottom-right cell.
Constraints:
m == grid.length
n == grid[i].length
2 <= m, n <= 1000
4 <= m * n <= 105
0 <= grid[i][j] <= 105
grid[0][0] == 0
Solution
class Solution {
using pi = pair<int, int>;
static constexpr int MOVES[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
int minimumTime(vector<vector<int>>& grid) {
int rows = grid.size();
int cols = grid.front().size();
if(grid[0][1] > 1 && grid[1][0] > 1) return -1;
map<int, int> times;
priority_queue<pi, vector<pi>, greater<pi>> pq;
pq.push({0, 0});
while(pq.size()) {
auto [time, pos] = pq.top();
pq.pop();
if(times.count(pos)) continue;
times[pos] = time;
int row = pos / cols;
int col = pos % cols;
for(int i = 0; i < 4; ++i) {
int newCol = col + MOVES[i][0];
int newRow = row + MOVES[i][1];
if(newCol < 0 || newRow < 0 || newRow >= rows || newCol >= cols) continue;
int newPos = newRow * cols + newCol;
if(times.count(newPos)) continue;
int newTime = grid[newRow][newCol] > time + 1 ? 1 - (grid[newRow][newCol] - time) % 2 + grid[newRow][newCol]: time + 1;
pq.push({newTime, newPos});
}
}
return times[rows * cols - 1];
}
};