文章目录
Leetcode62
1.问题描述
2.解决方案
动态规划,类似于爬楼梯
class Solution {
public int uniquePaths(int m, int n) {
//1.初始化
int[][] ints = new int[m][n];
//2.边界,第一行第一列只有一种方法到达
for(int i=0; i<n; i++) ints[0][i]=1;
for(int i=0; i<m; i++) ints[i][0]=1;
//2.遍历
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
ints[i][j]=ints[i-1][j]+ints[i][j-1];
}
}
return ints[m-1][n-1];
}
}
Leetcode63
1.问题描述
2.解决方案
1.本题整体上和62一样,但是多了个障碍物,其实基本差不多,就是在边界需要注意,障碍物的地方和需要经过障碍物的dp都是0
2.然后遍历就正常遍历,如果是障碍物就跳过就好
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
//1.初始化
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
//必要的检查 就是起点或者终点如果是障碍物当然不行 以及矩阵的大小的检查都蕴含在里面了
if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1) return 0;
int[][] dp=new int[m][n];
//2.边界 第一行第一列 dp数组中 障碍物是0 需要经过障碍物的也是0
dp[0][0]=1;
for (int i = 1; i <n ; i++) {
if(obstacleGrid[0][i]==0){
dp[0][i]=1;
}else break;
}
for (int i = 1; i <m ; i++) {
if(obstacleGrid[i][0]==0){
dp[i][0]=1;
}else break;
}
//3.遍历
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if(obstacleGrid[i][j]==1) continue;
//如果不是障碍物就可以放心的dp 不用关心上面和左边是否为障碍物 因为障碍物是0 需要经过障碍物的也是0
dp[i][j]=dp[i-1][j]+dp[i][j-