Leetcode62:Unique Paths
Leetcode63:Unique Paths II
题目描述:Unique Paths
简而言之,只能朝右走或朝下走,计算网格中从左上角走到右下角一共有多少种走法。
题目描述:Unique Paths II
简而言之,只能朝右走或朝下走,这次网格离可能会布置一些障碍,此时网格中从左上角走到右下角一共有多少种走法。
采用动态规划
解题过程
Unique Paths
两者本质上都是动态规划问题。
因为只能够朝右走或朝下走,在没有障碍的情况下,走到某一格的走法就等于走到此格上方一格的走法加上此格左边一格的走法之和。最终的解就是右下角的走法。
-
令 dp[i][j] 是到达 i, j 的走法,列出动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
-
对于第一行和第一列,因为都在边界,所以到达这些网格只能有一种走法。先将这些初始化为1。
public int uniquePaths(int m, int n) {
if (m<=1||n<=1) {
return 1;
}
int [][]matrix=new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i==0||j==0) {
matrix[i][j]=1;
}
else {
matrix[i][j]=matrix[i-1][j]+matrix[i][j-1];
}
}
}
return matrix[m-1][n-1];
}
可以用一维数组对该算法进行优化。(但是我还没看懂)
Unique Paths II
当网格中可能有障碍时,机器人就不能通过该网格,只是对上述动态方程有了限制条件。
- 对于第一行和第一列,如果当前网格没有障碍,则初始化为1;否则,当前网格以及之后的网格都初始化为0
- dp[i][j] = dp[i-1][j] + dp[i][j-1],如果该网格没有障碍;否则 dp[i][j] = 0
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m =obstacleGrid.length;
int n=obstacleGrid[0].length;
int [][]matrix=new int[m][n];
for (int i = 0; i < m; i++) {
if (obstacleGrid[i][0]==1) {
for (int j = i; j < m; j++) {
matrix[j][0]=0;
}
break;
}
else {
matrix[i][0]=1;
}
}
for (int i = 0; i <n; i++) {
if (obstacleGrid[0][i]==1) {
for (int j = i; j < n; j++) {
matrix[0][j]=0;
}
break;
}else {
matrix[0][i]=1;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j]==1) {
matrix[i][j]=0;
}
else {
matrix[i][j]=matrix[i-1][j]+matrix[i][j-1];
}
}
}
return matrix[m-1][n-1];
}
其实,如果obstacleGrid[0][0]==1,就可以直接返回0种走法。
另外,应该还需要注意数值的溢出。