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

代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树

题目与题解

343. 整数拆分

题目链接:343. 整数拆分

代码随想录题解:343. 整数拆分

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

解题思路:

        一眼懵,直接看答案了

看完代码随想录之后的想法 

        前一天的题是由dp[i-2]和dp[i-1],递推出当前结果dp[i]。这题更复杂一些,是要根据dp[0]到dp[i-1],推算dp[i]的结果。

        对于数字i,可以分解为两个数字的和:j和i-j,因此求分解i的乘积,就是求j和分解i-j之后二者的乘积。那么如果dp[i]定义为数字i的最大乘积和,那么对于dp[i],遍历j from 1 to i - 1, 递推公式为求dp[i-j]*j和j * (i - j) 中的最大值。

        为避免重复计算,j最多取到i的一半。

class Solution {public int integerBreak(int n) {int[] dp = new int[n+1];if (n >= 2) dp[2] = 1;for (int i = 3; i <= n; i++) {for (int j = 1; j <= i/2; j++) {dp[i] = Math.max(dp[i], Math.max(j*(i-j), dp[i-j]*j));}}return dp[n];}
}

j怎么就不拆分呢?

j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

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

如果定义dp[i - j] * dp[j] 也是默认将一个数强制拆成4份以及4份以上了。

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

 还需要注意,初始化的方式是跟着定义走的,如果求的是max(dp[i - j] * dp[j]),为了计算正确,初始化的结果会跟dp[i]定义不符,容易出错。

遇到的困难

        第一次碰到这种题,想不到

96.不同的二叉搜索树 

题目链接:96.不同的二叉搜索树 

代码随想录题解:​​​​​​​96.不同的二叉搜索树 

视频讲解:动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树_哔哩哔哩_bilibili

解题思路:

        这题跟上面一题有一点类似,同样是要用多个dp[i-j]的值推出dp[i]。

        题目要求用1-n的数字构成不同的二叉搜索树,其实可以分解为,0-j-1的数字构成左子树,j为根节点,j到i构成右子树,那么

dp[i] = \sum_{1}^{i}dp[j-1]*dp[i-j]

        初始化dp[0]=dp[1]=0即可。

class Solution {public int numTrees(int n) {int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i ; j++) {dp[i] += dp[j-1] * dp[i-j];}}return dp[n];}
}

看完代码随想录之后的想法 

        以dp[3]为例

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

关键是看如何去分解,分解后如何正确确定遍历的上下限。

遇到的困难

        一开始写的时候没有想清楚遍历的边界,初始化的时候也有点糊涂,所以错了好几处。要记住按定义初始化dp,然后确定遍历上下界后,最好通过几个举例得到结果,保证边界正确。        

今日收获

        学会了如何用分解的方法使用dp,难度提升了很多。

http://www.lryc.cn/news/339913.html

相关文章:

  • 【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。
  • el-table多行合并
  • Vue3 + Element-Plus 使用 Table 插槽时数据未及时更新
  • vue 2 怎么把2024-04-13T17:42:19转换成短日期格式
  • 网络IO模型以及实际应用
  • 一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系
  • 《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》
  • maven命令
  • jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况
  • 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2
  • Cesium之home键开关及相机位置设置
  • FreeRTOS_day1
  • Nginx日志格式化和追踪
  • 华为交换机配置telnet SSH登录步骤
  • 市面上加密混淆软件的比较和推荐
  • 最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图
  • 电视盒子哪个好?2024口碑网络电视盒子排行榜
  • CookieSession
  • Nginx服务 重写功能与反向代理
  • Midjourney教程(完整版)-看这篇就够了
  • 服务器上部署GPU版的milvus向量数据库
  • 【配置】Docker安装可道云网盘
  • 复盘中得道,技术人的自由之路
  • Nginx配置大全【六大使用场景、七大负载均衡策略、四大负载健康检查】
  • GDPU Java 天码行空8
  • 《前端面试题》- JS基础 - 伪数组
  • TypeScript 基础语法
  • 服务器数据恢复—V7000存储raid5数据恢复案例
  • 扫雷 【搜索,哈希】
  • 如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器