题目(链接)

一个机器人位于一个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

题解

思路:

  • 动态规划
  • 终点位置可以从上面过来或者从左边过来,所以计算从上面过来的路径数+从左边过来的路径数就可以得到总的路径数。
  • 特殊判断第一行和第一列,因为这两个位置只有一种走的方案,即第一行只能从左边过来,第一列只能从上面过来。
  • 特判有障碍的位置,有障碍的位置是无法到达的,所以初始化第一行和第一列的时候只需要初始化不为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);
// 当不满足判断条件i < n && obstacleGrid[i][0] == 0时,跳出循环
// 这样一旦遇到障碍,后面的值还是0,只初始化障碍前的位置为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 ++){
// 如果当前位置不是障碍则可以进行计算
// 如果是障碍,则不计算,默认还是0,即没有方案到达
if (obstacleGrid[i][j] == 0){
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
} return f[n - 1][m - 1];
}
};

【Leetcode】63. 不同路径 II的更多相关文章

  1. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  2. [LeetCode] 63. 不同路径 II ☆☆☆(动态规划)

    描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...

  3. LeetCode 63. 不同路径 II(Unique Paths II)

    题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). ...

  4. leetcode 63 不同路径II

    二维数组动态规划,还可以采用一维数组进行动态规划. class Solution { public: int uniquePathsWithObstacles(vector<vector< ...

  5. Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

    Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...

  6. 刷题-力扣-63. 不同路径 II

    63. 不同路径 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-ii/ 著作权归领扣网络所有.商业转 ...

  7. 63.不同路径II

    目录 63.不同路径Ⅱ 题目 题解 63.不同路径Ⅱ 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动 ...

  8. [LeetCode] 63. Unique Paths II 不同的路径之二

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  9. LeetCode 63. Unique Paths II不同路径 II (C++/Java)

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  10. LeetCode 63. Unique Path II(所有不同路径之二)

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

随机推荐

  1. webpack学习笔记(一)安装与试用

    由于初次接触 webpack(官网),对很多方面都不是很理解,在查找部分资料后记录一下自己的见解(本文实践基于webpack4). 1. 个人见解 简单来说,webpack就是js的 打包 工具.个人 ...

  2. 【若归】 【LGR-142-Div.4】洛谷入门赛 #13赛后反思

    比赛链接:[LGR-142-Div.4]洛谷入门赛 #13 rk288,比前几次差(可能是因为rated?) A 十年OI一场空,不开long long见祖宗 #include<bits/std ...

  3. 【解决方案】Java 互联网项目如何防止集合堆内存溢出(一)

    目录 前言 一.代码优化 1.1Stream 流自分页 1.2数据库分页 1.3其它思考 二.硬件配置 2.1云服务器配置 三.文章小结 前言 OOM 几乎是笔者工作中遇到的线上 bug 中最常见的, ...

  4. DS18B20数字温度计 (二) 测温, ROM和CRC算法

    目录 DS18B20数字温度计 (一) 电气特性, 寄生供电模式和远距离接线 DS18B20数字温度计 (二) 测温, ROM和CRC算法 DS18B20数字温度计 (三) 1-WIRE总线 ROM搜 ...

  5. Lora 模块E22-400T22D(SX1268, 22dBm)

    无线串口(UART)模块, 基于SEMTECH SX1268射频芯片, 具有多种传输方式, 工作在410.125至493.125MHz频段(默认 433.125MHz). LoRa扩频技术, TTL电 ...

  6. Lambda 表达式总结

    1 Lambda 表达式简介 ​ Lambda 表达式是 JDK 8 的新特性,主要用于简化匿名内部类的定义,帮助用户方便.高效地书写优雅的代码. ​ Lambda 表达式实现的必须是一个接口,并且接 ...

  7. oracle sqlplus命令详解(官方示例)

    以为内容选自Oracle官方文档,只讲command-line: 规范:<变量名> , {举例} , a | b 枚举可选值,(XX)描述 ------------------------ ...

  8. win32-localtime的使用

    下面的例子用于反映本地系统的日期格式变化 // locale test #include <stdio.h> #include <locale.h> #include < ...

  9. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...

  10. error接口

    // 实际上它是interface类型,这个类型有一个返回错误信息的单一方法: type error interface{ Error() string } 创建一个error最简单的方法就是调用er ...