题目:
题解:动态规划
- 定义dp数组dp[i][j] : 表示从(0,0)出发到(i,j)有dp[i][j]条不同路径。
- 确定推导公式:dp[i][j] 只能从两个方向推导出来,即dp[i-1][j]和dp[i][j-1],所以dp[i][j] = dp[i-1][j] + dp[i][j-1]。
- 初始化:dp[i][0] 一定都是1,因为从(0,0)到dp[i][0]只有一条路,同理dp[0][j]也一定都是1。
注意:如果(i,j)是障碍物,那么dp[i[j]应该初始化0,表示没有一条路可以走到(i,j).
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int [][] dp = new int[m][n];
// 如果起点或者终点就是障碍物,直接返回0
if (obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1) {
return 0;
}
// 如果存在障碍物就停止初始化
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
dp[0][j] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 0) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
时间复杂度:O(m*n)