Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
You are given a 0-indexed 2D integer array grid
of size m x n
. Each cell has one of two values:
0
represents an empty cell,1
represents an obstacle that may be removed.You can move up, down, left, or right from and to an empty cell.
Return the minimum number of obstacles to remove so you can move from the upper left corner (0, 0)
to the lower right corner (m - 1, n - 1)
.
Example 1:
Input: grid = [[0,1,1],[1,1,0],[1,1,0]]
Output: 2
Explanation: We can remove the obstacles at (0, 1) and (0, 2) to create a path from (0, 0) to (2, 2).
It can be shown that we need to remove at least 2 obstacles, so we return 2.
Note that there may be other ways to remove 2 obstacles to create a path.
Example 2:
Input: grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]
Output: 0
Explanation: We can move from (0, 0) to (2, 4) without removing any obstacles, so we return 0.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 105
2 <= m * n <= 105
grid[i][j]
is either 0
or 1
.grid[0][0] == grid[m - 1][n - 1] == 0
public int minimumObstacles(int[][] grid) {
PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[2] - b[2]);
int[][] dir = new int[][] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int m = grid.length, n = grid[0].length;
int[][] count = new int[m][n];
for(int i = 0;i < m;i++) {
Arrays.fill(count[i], Integer.MAX_VALUE);
}
count[0][0] = 0;
q.offer(new int[]{0, 0, 0});
while(!q.isEmpty()) {
int[] cur = q.poll();
int x = cur[0];
int y = cur[1];
int cost = cur[2];
if(x == m - 1 && y == n - 1) {
return cost;
}
for(int i = 0;i < 4;i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx < 0 || ny < 0 || nx >= m || ny >= n) {
continue;
}
int now = cur[2];
if(grid[nx][ny] == 1) {
now++;
}
if(now >= count[nx][ny]) {
continue;
}
count[nx][ny] = now;
q.offer(new int[] {nx, ny, now});
}
}
return -1;
}
class Solution {
public:
int minimumObstacles(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
vector<vector<int>> dp(n, vector<int>(m, 1e5 + 1));
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;
pq.push({grid[0][0], 0, 0});
int dirs[4][2] = {{0, 1},{-1, 0},{1, 0},{0, -1}};
while (!pq.empty()) {
auto [c, i, j] = pq.top();
pq.pop();
if (i == n - 1 && j == m - 1) {
return c;
}
for (auto &d: dirs) {
int x = d[0] + i;
int y = d[1] + j;
if (x < 0 || y < 0 || x >= n || y >= m)
continue;
if (dp[x][y] > grid[x][y] + c) {
dp[x][y] = grid[x][y] + c;
pq.push({grid[x][y] + c, x, y});
}
}
}
return -1;
}
};
class Solution:
def minimumObstacles(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
q = [(0, 0, 0)]
dist = [[float('inf') for _ in range(n)] for _ in range(m)]
while q:
size = len(q)
for _ in range(size):
obs, x, y = heapq.heappop(q)
if dist[x][y] < float('inf'): continue
obs += grid[x][y]
dist[x][y] = obs
if x + 1 < m: heapq.heappush(q, (obs, x + 1, y))
if x > 0: heapq.heappush(q, (obs, x - 1, y))
if y + 1 < n: heapq.heappush(q, (obs, x, y + 1))
if y > 0: heapq.heappush(q, (obs, x, y - 1))
return dist[m - 1][n - 1]
In our experience, we suggest you solve this Minimum Obstacle Removal to Reach Corner LeetCode Solution and gain some new skills from Professionals completely free and we assure you will be worth it.
If you are stuck anywhere between any coding problem, just visit Queslers to get the Minimum Obstacle Removal to Reach Corner LeetCode Solution
I hope this Minimum Obstacle Removal to Reach Corner LeetCode Solution would be useful for you to learn something new from this problem. If it helped you then don’t forget to bookmark our site for more Coding Solutions.
This Problem is intended for audiences of all experiences who are interested in learning about Data Science in a business context; there are no prerequisites.
Keep Learning!
More Coding Solutions >>