Skip to content

1414. Shortest Path In A Grid With Obstacles Elimination

Difficulty: Hard

LeetCode Problem View on GitHub


1414. Shortest Path in a Grid with Obstacles Elimination

Hard


You are given an m x n integer matrix grid where each cell is either 0 (empty) or 1 (obstacle). You can move up, down, left, or right from and to an empty cell in one step.

Return the minimum number of steps to walk from the upper left corner (0, 0) to the lower right corner (m - 1, n - 1) given that you can eliminate at most k obstacles. If it is not possible to find such walk return -1.

 

Example 1:

Input: grid = [[0,0,0],[1,1,0],[0,0,0],[0,1,1],[0,0,0]], k = 1
Output: 6
Explanation: 
The shortest path without eliminating any obstacle is 10.
The shortest path with one obstacle elimination at position (3,2) is 6. Such path is (0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (3,2) -> (4,2).

Example 2:

Input: grid = [[0,1,1],[1,1,1],[1,0,0]], k = 1
Output: -1
Explanation: We need to eliminate at least two obstacles to find such a walk.

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 40
  • 1 <= k <= m * n
  • grid[i][j] is either 0 or 1.
  • grid[0][0] == grid[m - 1][n - 1] == 0

Solution

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;

class Solution {
    static class Tuple {
        int row, col, count;
        public Tuple(int row, int col, int count) {
            this.row = row;
            this.col = col;
            this.count = count;
        }
        @Override
        public String toString() {
            return "Tuple{" +
                   "row=" + row +
                   ", col=" + col +
                   ", count=" + count +
                   '}';
        }
    }
    static class customSort implements Comparator<Tuple> {
        @Override
        public int compare(Tuple first, Tuple second) {
            return Integer.compare(first.count, second.count);
        }
    }
    public int shortestPath(int[][] grid, int k) {
        int n = grid.length, m = grid[0].length;
        int dist[][][] = new int[n + 1][m + 1][k + 1];
        for (int current[][] : dist)
            for (int current1[] : current)
                Arrays.fill(current1, (int)(1e9));

        int dir[][] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        PriorityQueue<Tuple> pq = new PriorityQueue<>(new customSort());
        if (grid[0][0] == 1)
            dist[0][0][1] = 0;
        else
            dist[0][0][0] = 0;

        pq.offer(new Tuple(0, 0, grid[0][0]));
        while (pq.size() > 0) {
            int currRow = pq.peek().row, currCol = pq.peek().col, currCount = pq.peek().count;
            pq.poll();
            for (int dire[] : dir) {
                int newRow = currRow + dire[0], newCol = currCol + dire[1];
                if (newRow >= 0 && newCol >= 0 && newRow < n && newCol < m) {
                    if (grid[newRow][newCol] == 1) {
                        if (currCount < k) {
                            if (dist[newRow][newCol][currCount + 1] > dist[currRow][currCol][currCount] + 1) {
                                dist[newRow][newCol][currCount + 1] = dist[currRow][currCol][currCount] + 1;
                                pq.offer(new Tuple(newRow, newCol, currCount + 1));
                            }
                        }
                    } else {
                        if (dist[newRow][newCol][currCount] > dist[currRow][currCol][currCount] + 1) {
                            dist[newRow][newCol][currCount] = dist[currRow][currCol][currCount] + 1;
                            pq.offer(new Tuple(newRow, newCol, currCount));
                        }
                    }
                }
            }
        }
        int mini = Integer.MAX_VALUE;
        for (int i = 0; i <= k; i++)
            mini = Math.min(mini, dist[n - 1][m - 1][i]);
        if (mini == (int)(1e9))
            return -1;
        return mini;
    }
}

Complexity Analysis

  • Time Complexity: O(?)
  • Space Complexity: O(?)

Approach

Detailed explanation of the approach will be added here