| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 动态规划全题型解析 -> 正文阅读 |
|
[数据结构与算法]动态规划全题型解析 |
斐波那契数列普通的代码: 将数组压缩,使用滚动的方式缩小空间: 而此处如果使用递归的话时间复杂度是O(2^n)(为什么?) ?而空间复杂度:O(n) 算上了编程语?中实现递归的系统栈所占空间 此处的时间复杂度的思考,参照通过一道面试题目,讲一讲递归算法的时间复杂度! (qq.com) 来看求一个数的n次方,看下面这几段代码的时间复杂度: 递归算法的时间复杂度本质上是要看:?「递归的次数 * 每次递归中的操作次数」。
function2是递归,递归了n次,时间复杂度为O(n)
function3,我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一颗满二叉树。刚刚同学写的这个算法,可以用一颗满二叉树来表示(为了方便表示,选择n为偶数16),如图: 总共n-1个结点时间复杂度为O(n)
此处将代码在3的基础上改改,每次只调用一次递归,则此时调用递归的次数为树的深度,即为logn,时间复杂度即为O(logn) 再来看看前面的求斐波那契数列的递归法时间复杂度为什么是O(2^n)? 数学解法: 递归算法的时间复杂度,记计算第n个数的所需时间为T(n),那么T(n) = T(n-1) + T(n-2) ,由T(n-1) > T(n-2) 可以推出T(n) < 2T(n-1) < 2^2 * T(n-2)<2^(n-1)T(1),可以推出T(n)的时间复杂度为O(2^n)。 爬楼梯及其拓展根据dp[i]代表到第i层有几种方法,我们让i从1开始,舍弃dp[0],不考虑其意义。 代码很好写 重点是扩展: 这道题?还可以继续深化,就是?步?个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种?法爬 到n阶楼顶。 这?有难度了,这其实是?个完全背包问题,但?扣上没有这种题?,所以后续我在讲解背包问题的时 候,今天这道题还会拿从背包问题的?度上来再讲?遍。 其实就是对于dp[8],那么假如可以一次爬1个、2个、3个、4个台阶的话。 那么dp[8]的值就等于dp[8-1]+dp[8-2]+dp[8-3]+dp[8-4]。 所以代码如下: ? 扩展2:力扣746: ? dp[i]代表的是到第i层所花费的最小代价,并且支付了费用,然后可以往上走一或两层。 也就是说最后想走到第n层,是不需要付第n层的费用的。也就是说最后的返回值是min(dp[n-1],dp[n-2])。 另外这里下标它说从0开始,那就从0开始写,当然可以从1开始。 转移方程: dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; ?代码: 不同路径力扣 (leetcode.cn)
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年3日历 | -2025/3/13 2:21:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |