63. 不同路径 II
题目链接:
63. 不同路径 II
题目描述:
给定一个 m x n
的整数数组 grid
。一个机器人初始位于 左上角(即 grid[0][0]
)。机器人尝试移动到 右下角(即 grid[m - 1][n - 1]
)。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1
和 0
来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109
。
题目分析:
该题我选择用二维的dp数组来进行动态规划,最后位置的dp值即不同的路径数
官方题解使用的是二维变一维的滚动数组思想,二维就是比一维多判断几个条件,但更好理解一些
题解:
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {int row = obstacleGridSize;int col = *obstacleGridColSize;int dp[row][col]; memset(dp, 0, sizeof(dp)); // 将dp数组中的值全赋值为0 for(int i = 0; i < row; i++){ // 两重for循环遍历路径数组for(int j = 0; j < col; j++){ if(obstacleGrid[i][j]){ // 当前位置为障碍物时,dp数组中的值为0dp[i][j] = 0;continue;}if(i == 0 && j == 0){ // 当前位置为初始位置且不为障碍物dp[i][j] = 1;}else if(i-1 >= 0 && j-1 >= 0){ // 不是最上面的边或者最左边的边时dp[i][j] = dp[i-1][j] + dp[i][j-1];}else if(i-1 >= 0){ // 是最左边的边dp[i][j] = dp[i-1][j];}else{ // 是最上面的边dp[i][j] = dp[i][j-1];}}}return dp[row-1][col-1];
}