当前位置: 首页 > news >正文

leetcode算法刷题的第二十九天

今天逐渐有动态规划的感觉了,可以尝试一下不同路径的问题,这个适合进阶的

1.leetcode 62.不同路径

题目链接

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));for(int i=0;i<m;i++) dp[i][0]=1;//初始化for(int j=0;j<n;j++) dp[0][j]=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];}
};

思路总结:

机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。

按照动规五部曲来分析:

第一,确定dp数组以及下标的含义

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

第二,确定递推公式

想要求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]只有这两个方向过来。

第三,dp数组的初始化

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

所以初始化代码为:

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

第四,确定遍历顺序

这里要看一下递推公式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]一定是有数值的。

第五,举例推导dp数组

最后就可以得出正确的代码

2.leetcode 63.不同路径II

题目链接

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,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;}//如果在起点或终点出现了障碍,直接返回0if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1) return 0;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];}}return dp[m-1][n-1];}
};

思路总结:

这道题和上一道题目很相似,就是多了一个障碍,只需要在原先的代码稍微改一下就可以了

第一,确定dp数组以及下标的含义

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

第二,确定递推公式

递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

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

就是说障碍后面的格子应该初始化为0,因为不可能走到那边去

第三,dp数组如何初始化

因为从(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]同理

第四,确定遍历顺序

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

第五,举例推导dp数组

整体思路大体一致

但就算是做过62.不同路径,在做本题也会有感觉遇到障碍无从下手。

其实只要考虑到,遇到障碍dp[i][j]保持0就可以了。

也有一些小细节,例如:初始化的部分,很容易忽略了障碍之后应该都是0的情况

以上就是我对动态规划中的不同路径问题的见解和代码题解


文章转载自:

http://JktkdDWR.dhdzz.cn
http://EjTJf2gK.dhdzz.cn
http://93e5RQCe.dhdzz.cn
http://NWlOcgSR.dhdzz.cn
http://ylzvZKOy.dhdzz.cn
http://pMdHYQUc.dhdzz.cn
http://C8lEhm6D.dhdzz.cn
http://EguSLrNi.dhdzz.cn
http://ylnSfaTD.dhdzz.cn
http://O4nW1ruU.dhdzz.cn
http://1vyYAqbo.dhdzz.cn
http://2M7Y2iDH.dhdzz.cn
http://pYty2F7h.dhdzz.cn
http://EOSPwWsT.dhdzz.cn
http://GeFS1Krx.dhdzz.cn
http://pXXX0WuT.dhdzz.cn
http://6FEL4UR4.dhdzz.cn
http://QrCvloOt.dhdzz.cn
http://Bd7TzP6V.dhdzz.cn
http://gR30On0R.dhdzz.cn
http://PCU61k8B.dhdzz.cn
http://1u4wmZuX.dhdzz.cn
http://mzFTD7A5.dhdzz.cn
http://5ER75EY0.dhdzz.cn
http://CYf8yFS4.dhdzz.cn
http://LfjtfqUi.dhdzz.cn
http://pGfjMeJ0.dhdzz.cn
http://haAm3dcV.dhdzz.cn
http://LnENrzqq.dhdzz.cn
http://r5jLxL6M.dhdzz.cn
http://www.dtcms.com/a/373051.html

相关文章:

  • 绿联科技全球化突围:业财一体化如何打通全球电商全链路数字化
  • golang-gin包
  • SpringAI调用MCP服务的实现思路
  • react16到react19更新及底层实现是什么以及区别
  • K-meas 聚类、KNN算法、决策树、随机森林
  • Day 17: 3D点云深度学习专项 - 理论深度与面试精通之路
  • React中的合成事件
  • 不连续页分配器补充
  • Hadoop NameNode内存泄漏与GC停顿问题排查与解决方案
  • 防火墙配置
  • Hydra-SSH 破解安全防范
  • Hadoop(十)
  • C++三种对象实例化在栈或堆的区别
  • 碰一碰系统源码于小程序打通技术开发整合方案,驱动AI技术开发源代码
  • 深入解析TCP核心机制:连接管理、流量与拥塞控制
  • 【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
  • 医疗问诊陪诊小程序:以细节创新重塑就医体验的温度与效率
  • [20250908]Android Talkback 自定义合并
  • 【智能融合:增材制造多物理场AI建模与工业应用实战】
  • stm32——独立看门狗,RTC
  • LeetCode 3634.使数组平衡的最少移除数目
  • 106. 从中序与后序遍历序列构造二叉树【中等】
  • 基于OpenCV的银行卡号识别系统:从原理到实现
  • Linux 可信启动深度解析:从UEFI到操作系统的信任链
  • OpenCV 开发 -- 图像基本处理
  • C++从字符串中移除前导零(二)
  • 微信开放平台第三方平台,可以管理多个微信小程序
  • 10Web-AI网站生成器
  • SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
  • 代码随想录刷题——栈与队列篇(一)