【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)

大家都在看

  • Spring事务管理,声明式事务和编程式事务实现

    数据库操作过程中,对于增删改等操作,因为涉及到数据库状态的变更,为保证数据安全,需要进行事务管理;Spring事务管理有两种方式,即声明式事务管理和编程式事务管理; 连接池配置: …

    Linux 2023年6月16日
    0191
  • MySQL实现备份(1)

    完全备份和部分备份 冷备份、热备份、温备份 温备份适用于:myisam 热备份适用于:innodb 物理备份和逻辑备份 完全备份:备份所有数据 部分备份:只备份部分数据内容 两者第…

    Linux 2023年6月7日
    0134
  • 思科CISCO ASA 5521 防火墙 Ipsec 配置详解

    版本信息: Cisco Adaptive Security Appliance Software Version 9.9(2) Firepower Extensible Opera…

    Linux 2023年6月6日
    083
  • 命令大全目录

    linux 本文来自博客园,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/16341641.html O…

    Linux 2023年6月7日
    0125
  • centos 8及以上安装mysql 8.0

    本文适用于centos 8及以上安装mysql 8.0,整体耗时20分钟内,不需要FQ 1.环境先搞好 systemctl stop firewalld //关闭防火墙 syste…

    Linux 2023年6月7日
    092
  • go redis锁

    redis经常用作分布式锁,这里记录一个简单的锁代码如下: package main import ( "crypto/rand" "encoding…

    Linux 2023年5月28日
    0111
  • Mysql Date操作

    根据format字符串格式化date值。 下列修饰符可以被用在format字符串中: %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1s…

    Linux 2023年6月7日
    062
  • cpp-函数

    1.基础概念 &#x5F62;&#x53C2;:用在定义、申明处的参数,用于说明参数的类型、名称 &#x5B9E;&#x53C2;:用在函数调用,用…

    Linux 2023年6月7日
    0108
  • python reportlab 生成table学习笔记

    利用python report生成table表格,需要定义表格的数据,表格的样式,最后利用doc.build方法生成文件。 在reportlab中文手册中描述table方法: Ta…

    Linux 2023年6月14日
    082
  • Linux动静分离与Rewrite

    一、动静分离 1.1 单台机器动静分离 1、创建NFS挂载点(NFS服务端) mkdir /static vim /etc/exports /static 172.16.1.0/2…

    Linux 2023年5月27日
    093
  • goroutine 和 channel

    应用 实例1 go;collapse:true;;gutter:true; package main</p> <p>import ( "fmt&q…

    Linux 2023年6月8日
    076
  • 2021年1月-第02阶段-前端基础-HTML+CSS阶段-Day01

    HTML5 第一天 一、什么是 HTML5 HTML5 的概念与定义 定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML …

    Linux 2023年6月8日
    085
  • Java实现链表

    3、链表 MyLinkedList 有一个头指针,一个尾指针,还有链表长度size 内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构…

    Linux 2023年6月14日
    089
  • Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式; 忽略; 捕捉。 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作…

    Linux 2023年6月14日
    0112
  • 一文带你掌握Spring Web异常处理方式

    一、前言 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同事兼好朋友,匆匆赶往…

    Linux 2023年6月6日
    081
  • 【原创】Linux虚拟化KVM-Qemu分析(九)之virtio设备

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

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