Hard
Minimum Time to Visit a Cell In a Grid — C++
Full explanation · Time O(m * n * log\(m * n\)) · Space O(m * n)
// Time: O(m * n * log(m * n))
// Space: O(m * n)
// dijkstra's algorithm
class Solution {
public:
int minimumTime(vector<vector<int>>& grid) {
static const vector<pair<int, int>> DIRECTIONS = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
if (min(grid[0][1], grid[1][0]) > 1) {
return -1;
}
const auto& dijkstra = [&](const pair<int, int>& start, const pair<int, int>& target) {
vector<vector<int>> best(size(grid), vector<int>(size(grid[0]), numeric_limits<int>::max()));
best[start.first][start.second] = 0;
using Data = tuple<int, int, int>;
priority_queue<Data, vector<Data>, greater<Data>> min_heap;
min_heap.emplace(0, start.first, start.second);
while (!empty(min_heap)) {
const auto [curr, i, j] = min_heap.top(); min_heap.pop();
if (best[i][j] < curr) {
continue;
}
if (pair(i, j) == target) {
break;
}
for (const auto& [di, dj] : DIRECTIONS) {
const auto ni = i + di, nj = j + dj;
if (!(0 <= ni && ni < size(grid) &&
0 <= nj && nj < size(grid[0]) &&
best[ni][nj] > max(grid[ni][nj] + static_cast<int>(grid[ni][nj] % 2 == curr % 2), curr + 1))) {
continue;
}
best[ni][nj] = max(grid[ni][nj] + static_cast<int>(grid[ni][nj] % 2 == curr % 2), curr + 1);
min_heap.emplace(best[ni][nj], ni, nj);
}
}
return best[target.first][target.second];
};
return dijkstra(pair(0, 0), pair(size(grid) - 1, size(grid[0]) - 1));
}
};