137、不同路径||

题目描述:
在这里插入图片描述
网格中的障碍物和空位置分别用 1 和 0 来表示。

说明:m 和 n 的值均不超过 100。

示例 1:

输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

思路:使用动态规划,如果使用递归会内存溢出,白白写了那么多。。。
dp[i][j]表示的是到坐标i,j的次数,初始化的第一行和第一列为1,但是遇到1就跳出,之后从第一行和第一列开始。

代码:

class Solution {
 int count = 0;
	public  int uniquePathsWithObstacles(int[][] obstacleGrid) {
		int row = obstacleGrid.length;
		int col = obstacleGrid[0].length;
		int dp[][] = new int[row][col];
//		第一行初始化为 1碰到0就返回
		int i = 0;
		for (; i < obstacleGrid.length; i++) {
			if(obstacleGrid[i][0] == 1){
				break;
			}
			dp[i][0] = 1;
		}

		i = 0;
		for (; i < obstacleGrid[0].length; i++) {
			if(obstacleGrid[0][i] == 1){
				break;
			}
			dp[0][i] = 1;
		}
//		从第二行开始和第二列开始
		i = 1;
		for (; i < obstacleGrid.length; i++) {
			int j = 1;
			for (; j < obstacleGrid[0].length; j++) {
				if(obstacleGrid[i][j] == 1){
					dp[i][j] = 0;
				}else {
					dp[i][j] = dp[i-1][j] + dp[i][j-1];
				}
			}
		}
		
		return dp[row - 1][col - 1];
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_34446716/article/details/93893880