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).ide
Now consider if some obstacles are added to the grids. How many unique paths would there be?spa
An obstacle and empty space is marked as 1
and 0
respectively in the grid.code
Note: m and n will be at most 100.blog
Example 1:it
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
解答:io
這道題和62很類似,區別在於多了障礙物,不過仍然是用動態對規劃的方式,有障礙物的位置對路線數量的貢獻爲0,更新方法仍然相似,不過能夠直接在原來數組上進行更新,不須要新開闢空間class
代碼以下:grid
1 class Solution { 2 public: 3 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { 4 if (obstacleGrid[0][0] == 1) 5 return 0; 6 int row = obstacleGrid.size(); 7 int col = obstacleGrid[0].size(); 8 obstacleGrid[0][0] = 1; 9 for (int i = 1; i < row; i++) 10 { 11 if (obstacleGrid[i][0] == 0) 12 obstacleGrid[i][0] = obstacleGrid[i - 1][0]; 13 else 14 obstacleGrid[i][0] = 0; 15 } 16 for (int i = 1; i < col; i++) 17 { 18 if (obstacleGrid[0][i] == 0) 19 obstacleGrid[0][i] = obstacleGrid[0][i - 1]; 20 else 21 obstacleGrid[0][i] = 0; 22 } 23 for (int i = 1; i < row; i++) 24 for (int j = 1; j < col; j++) 25 { 26 if (obstacleGrid[i][j] == 0) 27 obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1]; 28 else 29 obstacleGrid[i][j] = 0; 30 } 31 return obstacleGrid[row - 1][col - 1]; 32 33 } 34 };
時間複雜度:O(m*n)方法
空間複雜度:O(1)