码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 05_不同路径2(带障碍物版)


    合集 - 数据结构与算法(57)
    1.01_设计一个有getMin功能的栈2023-09-222.02_由两个栈组成的队列2023-09-263.03_如何仅用递归函数和栈操作逆序一个栈2023-09-274.04_猫狗队列2023-10-055.05_用一个栈实现另一个栈的排序2023-10-066.06_用栈来求解汉诺塔问题2023-10-087.07_用队列实现栈2023-10-098.09_删除字符串中的所有相邻重复项2023-10-139.08_ 有效的括号2023-10-1110.10_逆波兰表达式求值2023-10-1611.11_滑动窗口最大值2023-10-1712.12_前K个高频元素2023-10-1813.01_移除链表元素2023-10-2314.02_设计链表2023-10-2415.03_反转链表2023-10-2516.04_两两交换链表中的节点2023-10-2617.05_删除链表的倒数第N个节点2023-10-2718.06_链表相交2023-10-3119.07_环形链表2023-11-0420.01_二叉树的递归遍历2023-11-0621.二叉树理论基础2023-11-0622.02_二叉树的迭代遍历2023-11-1023.04_二叉树的层序遍历2023-11-1024.05_二叉树的层次遍历II2023-11-1625.06_二叉树的右视图2023-11-1726.07_二叉树的层平均值2023-11-2027.08_N叉树的层序遍历2023-11-2328.09_每个行中找最大值2023-11-2329.10_填充每个节点的下一个右侧节点指针2023-11-2430.11_二叉树的最大深度2023-11-2531.12_二叉树的最小深度2023-11-2732.13_翻转二叉树2023-11-2833.14_对称二叉树2023-11-3034.15_完全二叉树的节点个数2023-12-0635.16_平衡二叉树2023-12-0636.17_二叉树的所有路径2023-12-0637.18_左叶子之和2023-12-0738.19_找树左下角的值2023-12-0839.20_路径总和2023-12-0940.21_从中序与后序遍历序列构造二叉树2023-12-2041.22_最大二叉树2023-12-2142.23_合并二叉树2023-12-2243.24_二叉搜索树中的搜索2023-12-2544.27_二叉搜索树的众数01-0945.28_二叉树的最近公共祖先01-0946.29_二叉搜索树中的插入操作01-1847.30_删除二叉搜索树中的节点01-2048.31_修剪二叉搜索树01-2049.32_将有序数组转换为平衡二叉搜索树01-2350.33_把二叉搜索树转换为累加树01-2451.动态规划理论05-2452.01_斐波那契数列05-2453.02_爬楼梯05-2454.03_使用最小花费爬楼梯05-2455.04_不同路径05-25
    56.05_不同路径2(带障碍物版)05-25
    57.06_整数拆分05-27
    收起

    63. 不同路径 II

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

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

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

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

    image-20240525102817297

    【思路】

    动规五部曲:

    1、确定dp数组以及下标的含义

    dp[i][j]:表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径。

    2、确定递推公式

    递推公式和上面那题一样,dp[i][j] = dp[i-1][j]+dp[i][j-1]。

    但这里需要注意的是,因为有了障碍的话应该就保持初始状态(初始状态为0)。

    if (obstacleGrid[i][j] == 0) {//当(i, j)没有障碍的时候,再推导dp[i][j]
    	dp[i][j] = dp[i-1][j] + dp[i][j-1];
    }
    

    3、dp数组如何初始化

    int[][] dp = new int[m][n];
    for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
    for(int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
    

    因为从(0,0)的位置到(i,0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。

    但如果(i, 0)这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。

    注意代码里for循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理

    4、确定遍历顺序

    从递归公式dp[i][j]=dp[i-1][j]+dp[i][j-1]中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i-1][j]和dp[i][j-1]一定有数值。

    for(int i = 1; i < m; i++) {
    	for (int j = 1; j < n; j++) {
    		if(obstacleGrid[i][j] == 1) continue;
    		dp[i][j] = dp[i-1][j] + dp[i][j-1];
    	}
    }
    

    5、举例推导dp数组

    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int m = obstacleGrid.length;
            int n = obstacleGrid[0].length;
            int[][] dp = new int[m][n];
    
            //如果在起点或终点出现了障碍,直接返回0
            if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
                return 0;
            }
    
            for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
                dp[i][0] = 1;
            }
            for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
                dp[0][j] = 1;
            }
    
            for (int i = 1; i < m; i++) {
                for (int j = 1; j < n; j++) {
                    dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
                }
            }
            return dp[m - 1][n - 1];
        }
    }
    
  • 相关阅读:
    SpringBoot:Web开发之三大组件详解
    如何实现一个AI聊天功能
    模拟退火算法
    SQL注入——预编译CASE注入
    【ACM】输入输出问题(2)
    Hudi第二章:集成Spark
    JDBC快速入门
    代码混淆和加固,保障应用程序的安全性
    Java开发者的Golang进修指南:从0->1带你实现协程池
    基于vscode的c++开发(Windows)
  • 原文地址:https://www.cnblogs.com/codingbao/p/18212177
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号