不同路径Ⅱ(LeetCode-63)

简介: 不同路径Ⅱ(LeetCode-63)

5. 不同路径Ⅱ(LeetCode-63)


题目

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


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


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


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


示例 1:


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


示例 2:


输入:obstacleGrid = [[0,1],[0,0]]
输出:1


提示:


m == obstacleGrid.length

n == obstacleGrid[i].length

1 <= m, n <= 100

obstacleGrid[i][j] 为 0 或 1


思路

五部曲


dp[m][n] 含义:到达m行n列有 dp[m][n] 条路径


机器人每次只能向下或向右移动,所以该点路径条数只与它上面和左边的点有关,是它们路径条数之和。这里比先前的题多了障碍,所以障碍这点的 dp 值为零

image.png


初始化时,最左边一列和最上面一行的值肯定为1。但要注意如果有障碍,那么那点 dp 值要为零。还要注意只要有一个障碍,那它后面的值不用算了,肯定为零


要先有 − 1才能有你,肯定正序



代码展示

class Solution
{
public:
    int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid)
    {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n));
        for (int i = 0; i < m; i++)
        {
            if (obstacleGrid[i][0] == 0)
            {
                dp[i][0] = 1;
            }
            else
            {
                dp[i][0] = 0;
                break;
            }
        }
        for (int i = 0; i < n; i++)
        {
            if (obstacleGrid[0][i] == 0)
            {
                dp[0][i] = 1;
            }
            else
            {
                dp[0][i] = 0;
                break;
            }
        }
        for (int i = 1; i < m; i++)
        {
            for (int j = 1; j < n; j++)
            {
                if (obstacleGrid[i][j] == 0)
                {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
                else
                {
                    dp[i][j] = 0;
                }
            }
        }
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cout << dp[i][j] << " ";
            }
            cout << endl;
        }
        return dp[m - 1][n - 1];
    }
};
目录
相关文章
|
7月前
【每日一题Day285】LC980不同路径 III | 回溯
【每日一题Day285】LC980不同路径 III | 回溯
61 0
|
2月前
lanqiao OJ 89 路径之谜
lanqiao OJ 89 路径之谜
22 1
|
7月前
|
vr&ar
leetcode热题100.路径总和 III
leetcode热题100.路径总和 III
41 1
|
7月前
|
算法 C语言
【牛客-算法】NC56 回文数字
🚩 前言 🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中! 🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈
59 0
《蓝桥杯每日一题》dfs·AcWing3502. 不同路径数
《蓝桥杯每日一题》dfs·AcWing3502. 不同路径数
70 0
|
机器人
leetcode每日一题:62. 不同路径
leetcode每日一题:62. 不同路径
|
存储 Windows
LeetCode每日一题(5)——文件的最长绝对路径
文件的最长绝对路径 1.题目 2.示例 3.思路 4.代码 5.复杂度分析
LeetCode每日一题(5)——文件的最长绝对路径
每日三题-最大子数组和、不同路径、最小路径和
每日三题-最大子数组和、不同路径、最小路径和
74 0
每日三题-最大子数组和、不同路径、最小路径和
LeetCode每日一题——687. 最长同值路径
两个节点之间的路径长度 由它们之间的边数表示。
69 0
LeetCode每日一题——687. 最长同值路径