| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode刷题day53 -> 正文阅读 |
|
[数据结构与算法]LeetCode刷题day53 |
62. 不同路径题目描述一个机器人位于一个 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1:
示例 2:
示例 3:
示例 4:
思路分析方法一:深搜 机器人只能向下和向右走,所以按照Dfs的书写步骤来操作即可. 但是由于深搜的时间复杂度是 O ( 2 ( m + n ? 1 ) ) O(2^(m+n-1)) O(2(m+n?1)) 的,所以会超时! 方法二:动态规划 机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。 按照 动规五部曲 来分析:
要求 此时在回顾一下 那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。
如何初始化呢,首先
这里要看一下递归公式 这样就可以保证推导
参考代码方法一:深搜
方法二:动态规划
63. 不同路径 II题目描述一个机器人位于一个 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用 示例 1:
示例 2:
思路分析这道题相对于62.不同路径 (opens new window)就是有了障碍。这有障碍了,应该怎么算呢? 动规五部曲:
递推公式和 62.不同路径 一样, 但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。
因为从(0, 0)的位置到(i, 0)的路径只有一条,所以 但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的 如图:
从递归公式
拿示例1来举例如题: 对应的dp 如图: 参考代码
343. 整数拆分题目描述给定一个正整数 返回 你可以获得的最大乘积 。 示例 1:
示例 2:
思路分析动规五部曲
dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。
可以想 其实可以从1遍历j,然后有两种渠道得到dp[i]. 一个是 一个是 那有同学问了,j怎么就不拆分呢? j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。 所以递推公式: 那么在取最大值的时候,为什么还要比较dp[i]呢? 因为在递推公式推导的过程中,每次计算dp[i],要取最大值。
dp[0] dp[1]应该初始化多少呢? 有的题解里会给出dp[0] = 1,dp[1] = 1的初始化,但解释比较牵强,主要还是因为这么初始化可以把题目过了。 严格从dp[i]的定义来说,dp[0] dp[1] 就不应该初始化,也就是没有意义的数值。而且题目中 这里我只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1,这个没有任何异议!
确定遍历顺序,先来看看递归公式: dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。 枚举j的时候,是从1开始的。i是从3开始,这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。 另外
当n为10 的时候,dp数组里的数值,如下: 参考代码
96. 不同的二叉搜索树题目描述给你一个整数 示例 1:
示例 2:
思路分析我们先观察下有没有什么规律,如图: 来看看n为3的时候,有哪几种情况。
发现到这里,其实我们就找到了重叠子问题了,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。 思考到这里,这道题目就有眉目了。 dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量
有2个元素的搜索树数量就是dp[2]。 有1个元素的搜索树数量就是dp[1]。 有0个元素的搜索树数量就是dp[0]。 所以 如图所示: 此时我们已经找到递推关系了,那么可以用**动规五部曲**再系统分析一遍。
dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。 以下分析如果想不清楚,就来回想一下dp[i]的定义
在上面的分析中,其实已经看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] (j相当于是头结点的元素,从1遍历到i为止。) 所以递推公式:
初始化,只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。 那么dp[0]应该是多少呢? 从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。 从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。 所以初始化dp[0] = 1
首先一定是遍历节点数,从递归公式: 那么遍历i里面每一个数作为头结点的状态,用j来遍历。
n为5时候的dp数组状态如图: 参考代码
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:53:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |