【Leetcode】63. 不同路径 II

一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10来表示。

示例1:

【Leetcode】63. 不同路径 II
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例2:

【Leetcode】63. 不同路径 II
输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <="100</code"><!--=-->
  • obstacleGrid[i][j] &#x4E3A; 0 &#x6216; 1

题解

思路:

  • 动态规划
  • 终点位置可以从上面过来或者从左边过来,所以计算从上面过来的路径数+从左边过来的路径数就可以得到总的路径数。
  • 特殊判断第一行和第一列,因为这两个位置只有一种走的方案,即第一行只能从左边过来,第一列只能从上面过来。
  • 特判有障碍的位置,有障碍的位置是无法到达的,所以初始化第一行和第一列的时候只需要初始化不为1的部分,而且一旦遇到障碍,障碍后面的位置均为0.

code:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n = obstacleGrid.size();
        int m = obstacleGrid[0].size();
        int f[n + 10][m + 10];
        memset(f, 0, sizeof f);
        // &#x5F53;&#x4E0D;&#x6EE1;&#x8DB3;&#x5224;&#x65AD;&#x6761;&#x4EF6;i < n && obstacleGrid[i][0] == 0&#x65F6;&#xFF0C;&#x8DF3;&#x51FA;&#x5FAA;&#x73AF;
        // &#x8FD9;&#x6837;&#x4E00;&#x65E6;&#x9047;&#x5230;&#x969C;&#x788D;&#xFF0C;&#x540E;&#x9762;&#x7684;&#x503C;&#x8FD8;&#x662F;0&#xFF0C;&#x53EA;&#x521D;&#x59CB;&#x5316;&#x969C;&#x788D;&#x524D;&#x7684;&#x4F4D;&#x7F6E;&#x4E3A;1
        for (int i = 0; i < n && obstacleGrid[i][0] == 0; i ++){
            f[i][0] = 1;
        }
        for (int j = 0; j < m && obstacleGrid[0][j] == 0; j ++){
            f[0][j] = 1;
        }

        for (int i = 1; i < n; i ++){
            for (int j = 1; j < m; j ++){
                // &#x5982;&#x679C;&#x5F53;&#x524D;&#x4F4D;&#x7F6E;&#x4E0D;&#x662F;&#x969C;&#x788D;&#x5219;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;
                // &#x5982;&#x679C;&#x662F;&#x969C;&#x788D;&#xFF0C;&#x5219;&#x4E0D;&#x8BA1;&#x7B97;&#xFF0C;&#x9ED8;&#x8BA4;&#x8FD8;&#x662F;0&#xFF0C;&#x5373;&#x6CA1;&#x6709;&#x65B9;&#x6848;&#x5230;&#x8FBE;
                if (obstacleGrid[i][j] == 0){
                    f[i][j] = f[i - 1][j] + f[i][j - 1];
                }
            }
        }

        return f[n - 1][m - 1];
    }
};
</vector<int>

Original: https://www.cnblogs.com/Timesi/p/16692305.html
Author: 顾北清
Title: 【Leetcode】63. 不同路径 II

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578189/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球