2020年7月6日 不同路径 II uniquePathsWithObstacles
默认格式:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
}
}
解题思路:
感觉这道题可以使用动态规划来做,我们从一个点的角度上来看,如果他同时能够向右和向下移动,那么道路的选择就多了一条。如果只有一个可以选择,那么道路数不变,如果下和右都是障碍,那么表示当前位置没有道路可以选择。
图解:
动态规划的最主要的思想就是,情况i+1的结果可以有情况i的结果推出。在这道题中也是:
我们先判断右下角同时作为起点和中的情况下,道路数是1。
然后我们放大这个区域。右下角的这一个点判断能够到达自己的所有的点有几条。可以看成一个2X1和一个1X2的矩形,我们可以得到两个新的点到达右下角的道路数,0和1.
每一个节点都是他下面和右边两个位置上值的和。
根据这个规则,我们可以遍历数组,得到左上角的值。
下图也能验证该算法的正确性
代码实现:
一遍通过,100%完美
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int len1=obstacleGrid.length;
int len2=obstacleGrid[0].length;
if (obstacleGrid[len1-1][len2-1]==1){
return 0;
}
for(int i=len1-1;i>=0;i--){
for (int j=len2-1;j>=0;j--){
if (obstacleGrid[i][j]==1)
obstacleGrid[i][j]=0;
else
//如果当前节点的右边和下边都存在,值等于两者加在一起
if (i+1<len1&&j+1<len2){
obstacleGrid[i][j]=obstacleGrid[i+1][j]+obstacleGrid[i][j+1];
}
//如果只有下面那个存在
else if (i+1<len1){
obstacleGrid[i][j]=obstacleGrid[i+1][j];
}
else if (j+1<len2){
obstacleGrid[i][j]=obstacleGrid[i][j+1];
}else {
obstacleGrid[i][j]=1;
}
}
}
return obstacleGrid[0][0];
}