代码随想录算法训练营第三十九天|62.不同路径|63. 不同路径 II

news/2024/12/22 23:32:14/

LeetCode62.不同路径

       动态规划五部曲:

        1,确定dp数组(dp table)以及下标的含义:dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

        2,确定递推公式:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

        3,dp数组的初始化:如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

        4,确定遍历顺序:这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。

        5,举例推导dp数组:如图所示:

        

 Java代码如下:

    public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int i = 0; i < n; i++) {dp[0][i] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}

LeetCode63. 不同路径 II

       动态规划五部曲:

        1,确定dp数组(dp table)以及下标的含义:dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

        2,确定递推公式:递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。所以代码为:

if (obstacleGrid[i][j] == 0) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}

        3,dp数组如何初始化:在62.不同路径 (opens new window)不同路径中我们给出如下的初始化:

vector<vector<int>> dp(m, vector<int>(n, 0)); // 初始值为0
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;

        因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。如图:

 

下标(0, j)的初始化情况同理。所以本题初始化代码为:

vector<vector<int>> dp(m, vector<int>(n, 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循环的终止条件,一旦遇到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数组:拿示例1来举例如题:

 对应的dp table 如图:

 

 Java代码如下:

public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];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];}   

 


http://www.ppmy.cn/news/237573.html

相关文章

crontab command not found

在服务器上运行 crontab -e编辑定时任务 结果提示 command not found命令找不到&#xff0c;这就说明没安装crontab https://www.cnblogs.com/lizhaoyao/p/5802291.html?utm_sourceitdadao&utm_mediumreferral

java平方根用代码怎么实现_[Java教程]快速平方根算法的javascript实现

[Java教程]快速平方根算法的javascript实现 0 2015-09-10 17:00:07 前几天看见了一个来自雷神之槌的平方根源码,原理多方有介绍&#xff0c;不赘述。 源码是c语言写的&#xff0c;我思考后发现这样的算法在javascript中也是可以完成的。function InvSqrt(x){ var h0.5*x; var b…

Python queue 模块

Python queue 模块 1、Queue2、Queue & Threading -- 13、Queue & Threading -- 2 1、Queue Init signature: queue.Queue(maxsize0)Docstring: Create a queue object with a given maximum size.If maxsize is < 0, the queue size is infinite. from queue imp…

2.集成开发环境搭建(IDE)

集成开发环境搭建&#xff08;IDE&#xff09; 1.安装eclipse2.启动eclipse3.设置编码格式UTF-84.快捷操作5.使用eclipse创建java项目6.制表符&#xff08;了解&#xff09; 1.安装eclipse 官网:https://www.eclipse.org/downloads/ 2.启动eclipse 双击打开eclipse&#xff…

汇编语言集成开发环境略述

(一)编辑器(Editor) 编辑器是不可或缺的,而现在的编辑器也实在太多,在dos下你肯定用过经典的dos自带的edit,或者 asmedit,wps等,然而现在平台已经转移到了Windows,我们的选择就更加丰富了,替代edit的是notepad,甚至有word,wps2000这样强大的文字处理工具,然而选择他们并不是写a…

JS逆向之艺恩数据

文章目录 目标网站数据加密问题分析接口&#xff0c;断点调试简化还原 js最后一步&#xff0c;python还原js算法 文章内容仅用于学习和技术交流&#xff0c;如有侵权请联系我删除。 目标网站 https://www.endata.com.cn/BoxOffice/BO/Year/index.html 数据加密问题 我们先看…

C 编程异常 — double free or corruption (fasttop)

问题&#xff1a;运行代码的时候程序崩溃。 *** Error in ./parsing: double free or corruption (fasttop): 0x00000000023d2350 ***Backtrace: /lib64/libc.so.6(0x81679)[0x7f349ead0679] ./parsing[0x4011fe] ./parsing[0x401b07] /lib64/libc.so.6(__libc_start_main0xf…

微信小程序开发—(一)全局配置

一.app.json 使用app.json文件来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等. 注意在.json不能注释&#xff0c;否则会出错。 二.工具栏tabBar 如果我们的小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部…