不同路径Ⅱ(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];
    }
};
目录
相关文章
|
机器学习/深度学习 分布式计算 算法
《R语言数据挖掘》——导读
Preface 前  言 世界各地的统计学家和分析师正面临着处理许多复杂统计分析项目的迫切问题。由于人们对数据分析领域的兴趣日益增加,所以R语言提供了一个免费且开源的环境,非常适合学习和有效地利用现实世界中的预测建模方案。
2586 0
|
物联网
【逻辑思考】你真的有权力活出自己吗?
这里就关于我对工作的选择,谈谈人生。 很多人主张活出自己,做自己想做的事,但你真的有权力活出自己吗? 在我的2016年终总结中,我曾经写道: 为了孩子 有人说科技对未来的影响最大,我不赞同!如果没有一代代人对梦想的追求,科技可能还在原地踏步。
1194 0
|
存储 NoSQL 分布式数据库
图数据库 Nebula Graph 在 HBaseCon Asia2019 的分享实录
本篇文章是根据 Nebula Graph 技术总监在 HBaseCon Asia2019 的分享整理而成,讲解了图数据库相关内容。
4497 0
|
域名解析 弹性计算 NoSQL
飞天加速计划·高校学生在家实践——ECS服务器初体验
我当前是计算机专业研二学生,现就读于北京科技大学,主攻方向是计算机视觉(CV)中的图像分割,我们实验室也有GPU计算集群,不过在知乎偶然一次机会了解到阿里云的高校计划,从链接点进来后,经过一系列熟悉的操作,我慢慢了解到云服务器ECS这一概念。
|
算法
LeetCode 135.分发糖果(贪心算法)
LeetCode 135.分发糖果(贪心算法)
331 0
LeetCode 135.分发糖果(贪心算法)
|
存储 Java 关系型数据库
JPA1|学习笔记
快速学习JPA1
416 0
JPA1|学习笔记
|
Ubuntu Java 关系型数据库
|
机器学习/深度学习 数据采集 人工智能
【深度学习前沿应用】文本生成
【自然语言处理(NLP)】文本生成,基于百度飞桨开发,参考于《机器学习实践》所作。
433 1
【深度学习前沿应用】文本生成

热门文章

最新文章