Skip to content

Latest commit

 

History

History
159 lines (136 loc) · 4.62 KB

63. Unique Paths II.md

File metadata and controls

159 lines (136 loc) · 4.62 KB

leetcode-cn Daily Challenge on July 6th, 2020.


Difficulty : Medium


A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

Now consider if some obstacles are added to the grids. How many unique paths would there be?

1

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

Note: m and n will be at most 100.

Example 1:

Input:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right

Solution

  • mine
    • Java
      • Dynamic Programming

        Runtime: 1 ms, faster than 26.41%, Memory Usage: 39.1 MB, less than 30.22% of Java online submissions

        // O(S)time O(S)space
        // S = r * c 
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            if(obstacleGrid == null 
               || obstacleGrid.length == 0 
               || obstacleGrid[0].length == 0
               || obstacleGrid[0][0] != 0){
                return 0;
            }
            //dp[i][j] = dp[i-1][j] + dp[i][j-1];
            int r = obstacleGrid.length;
            int c = obstacleGrid[0].length;
            int[][] dp = new int[r][c];
            for(int i = 0; i < r; i++){
                for(int j = 0; j < c; j++){
                    if(obstacleGrid[i][j] != 0){
                        continue;
                    }
                    if(i == 0 && j == 0){
                        dp[i][j] = 1;
                        continue;
                    }
                    if(i == 0){
                        dp[i][j] = dp[i][j - 1];
                    }else if(j == 0){
                        dp[i][j] = dp[i - 1][j];
                    }else{
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                    }
                }
            }
            return dp[r - 1][c - 1];
        }
        

  • the most votes
    • Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.5 MB, less than 14.52% of Java online submissions
      // O(R*C)time  O(C)space
      public int uniquePathsWithObstacles(int[][] obstacleGrid) {
          int width = obstacleGrid[0].length;
          int[] dp = new int[width];
          dp[0] = 1;
          for (int[] row : obstacleGrid) {
              for (int j = 0; j < width; j++) {
                  if (row[j] == 1)
                      dp[j] = 0;
                  else if (j > 0)
                      //dp[j] is dp[i-1][j]
                      dp[j] += dp[j - 1];
              }
          }
          return dp[width - 1];
      }
      

  • the leetcode solution
    • Dynamic Programming

      Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.7 MB, less than 8.31% of Java online submissions

      // O(R*C)time O(1)space
      public int uniquePathsWithObstacles(int[][] obstacleGrid) {
      
          int R = obstacleGrid.length;
          int C = obstacleGrid[0].length;
      
          // If the starting cell has an obstacle, then simply return as there would be
          // no paths to the destination.
          if (obstacleGrid[0][0] == 1) {
              return 0;
          }
      
          // Number of ways of reaching the starting cell = 1.
          obstacleGrid[0][0] = 1;
      
          // Filling the values for the first column
          for (int i = 1; i < R; i++) {
              obstacleGrid[i][0] = (obstacleGrid[i][0] == 0 && obstacleGrid[i - 1][0] == 1) ? 1 : 0;
          }
      
          // Filling the values for the first row
          for (int i = 1; i < C; i++) {
              obstacleGrid[0][i] = (obstacleGrid[0][i] == 0 && obstacleGrid[0][i - 1] == 1) ? 1 : 0;
          }
      
          // Starting from cell(1,1) fill up the values
          // No. of ways of reaching cell[i][j] = cell[i - 1][j] + cell[i][j - 1]
          // i.e. From above and left.
          for (int i = 1; i < R; i++) {
              for (int j = 1; j < C; j++) {
                  if (obstacleGrid[i][j] == 0) {
                      obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
                  } else {
                      obstacleGrid[i][j] = 0;
                  }
              }
          }
      
          // Return value stored in rightmost bottommost cell. That is the destination.
          return obstacleGrid[R - 1][C - 1];
      }