示例 1:數組
輸入: [ [0,0,0], [0,1,0], [0,0,0] ] 輸出: 2 解釋: 3x3 網格的正中間有一個障礙物。 從左上角到右下角一共有 條不一樣的路徑: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
思路分析這個問題和上一篇路徑題的分析同樣,不一樣之處在於,加了障礙物。那麼咱們能夠從新定義一個二維數組,用來返回路徑數,具體思路見代碼註釋。2
public static int uniquePathsWithObstacles(int[][] arr) { int m = arr.length; int n = arr[0].length; //若是起始位置和終點位置爲1,直接返回0 if(arr[0][0] == 1 || arr[m-1][n-1] == 1) return 0; //若是m == 1,判斷第m-1行是否是有1,有1直接返回0,不然返回1 if(m == 1) { for(int j = 1;j<n;j++) { if(arr[0][j] == 1) return 0; } return 1; } //若是n == 1,判斷第n-1列是否是有1,有1直接返回0,不然返回1 if(n == 1) { for(int i = 1;i < m;i++) { if(arr[i][0] == 1) return 0; } return 1; } //定義和輸入數組arr同樣大小的數組,做爲判斷 int[][] array = new int[m][n]; for(int j = 1;j<n;j++) { //判斷arr[0][j]是否等於1,若是不等於1,那麼array[0][j]等於0,若是等於1, //從j列開始到j<n,array[0][j]所有賦值爲0 if(arr[0][j] == 0) { array[0][j] = 1; }else { for(int k = j;k<n;k++) { array[0][k] = 0; } break; } } for(int i = 1;i<m;i++) { //判斷arr[i][0]是否等於1,若是不等於1,那麼array[i][0]等於0,若是等於1, //從i行開始到i<m,array[i][0]所有賦值爲0 if(arr[i][0] == 0) { array[i][0] = 1; }else { for(int k = i;k<m;k++) { array[k][0] = 0; } break; } } for(int i = 1;i<m;i++) { for(int j = 1;j<n;j++) { //若是arr[i][j] == 1,array = 0,不然array[i][j] = array[i-1][j] + array[i][j - 1] if(arr[i][j] == 0) { array[i][j] = array[i-1][j] + array[i][j - 1]; } } } //返回數組array最後一個數 return array[m-1][n-1]; }