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

代码随想录算法训练营第三十四天 | 62.不同路径 63.不同路径II 343.整数拆分

62.不同路径

题目链接:62. 不同路径 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

思路:机器人位于一个 m x n 网格,每次只能向下或者向右移动一步,达到网格的右下角总共有多少条不同的路径

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

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

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

2.确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1],

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

3.dp数组的初始化

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

4.确定遍历顺序

dp[i][j]都是从其上方和左方推导而来,从左到右一层一层遍历就可以了。

5.举例推导dp数组

时间复杂度:O(m × n)    空间复杂度:O(m × n)

63. 不同路径 II

题目链接:63. 不同路径 II - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

思路:机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点,中间有障碍物

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

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

2.确定递推公式

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。

3.dp数组初始化

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

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

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

4.确定遍历顺序

从左到右一层一层遍历

5.举例推导dp数组

时间复杂度:O(n × m)  空间复杂度:O(n × m)

343. 整数拆分

题目链接:343. 整数拆分 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili

思路:给定一个正整数 n,将其拆分为至少两个正整数的和,返回可以获得的最大乘积

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

dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。

2.确定递推公式

dp[i]最大乘积来自于,一个是j * (i - j) 直接相乘,一个是j * dp[i - j],

j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});

也就是Max{不拆i-j,  拆i-j (且拆后乘积最大),  到上一轮(i-1)为止的最大乘积},放入dp[i]是因为dp[i]最后的值应该时当i固定j循环时,每一整轮的最大值,而不是每次j变化的最大值

3.dp的初始化

dp[2] = 1

4.确定遍历顺序

dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。

5.举例推导dp数组

时间复杂度:O(n^2)    空间复杂度:O(n)

相关文章:

  • Springboot集成Dubbo和Zookeeper框架搭建
  • 基于 Vue + Django + MySQL 实现个人博客/CMS系统
  • 基于单片机的音乐播放器系统设计
  • FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现
  • 第一章 EDA技术概述
  • NLP高频面试题(三十)——LLama系列模型介绍,包括LLama LLama2和LLama3
  • AI原生应用爆发:从通用大模型到垂直场景的算力重构
  • C++ --- map和set的使用
  • 【Linux】高性能网络模式:Reactor 反应堆模式
  • 搞 PostgreSQL多才多艺的人--赵渝强 《PG数据库实战派》
  • 【容器】设备上没有剩余空间的错误排查处理
  • flutter WEB端启动优化(加载速度,加载动画)
  • ubuntu虚拟机裁剪img文件系统
  • WGAN的对偶性理解
  • Mybatis源码分析
  • 学习笔记--(7)
  • Linux_RHCSA笔记①
  • Vue+Elementui首页看板
  • vue中使用geoscene无法出现弹窗
  • Java项目实战--使用Java和LWJGL构建Minecraft风格游戏
  • 做网站开发要学什么软件/企业培训公司
  • 哪里可以做网站啊/快速百度
  • 东营网站建设规划书/学网络营销好就业吗
  • 动态网站开发技术 百度百科/上海网络推广渠道
  • 一个公司可以做多少网站/百度收录比较好的网站
  • 做网站申请域名/青岛网站开发公司