700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > [第1节]时间 空间复杂度 斐波那契 爬楼梯

[第1节]时间 空间复杂度 斐波那契 爬楼梯

时间:2021-06-16 04:36:41

相关推荐

[第1节]时间 空间复杂度 斐波那契 爬楼梯

我要学习下去~~

数据结构与算法我已经开始学习好几次了,总是从入门到放弃……

“(博客)请再一次做我的棋子,这一次,我一定会赢~”

死磕碎碎念:

1.知识点逐个学习,完成单点熟练,再搭建整个数据结构与算法的知识网络图,然后自己绘制脑图固化知识。

2.学习三分靠看,七分靠练。所以要多搭配对应的leetcode习题进行练习,练习时不要死磕,一道题,五分钟内没有思路,直接看题解,记忆别人优秀的代码化为己用,君子善假于物。

3.对于基本的算法模板,必须背诵默写,达到“脱手而出”的地步。

4.学习任何新的知识,都需要进行“刻意练习”,才能达到熟练的地步。

背诵代码

算法模板和leetcode代码一般都很简短,10~35行,结合康奈尔笔记,和手写代码的特点,用下面这个笔记模板,装订线设计在左侧,方便订书机装订,不时拿出观摩,望能成仙~

链接: /s/1BDuhyvMahWNI0malB4BvLQ 提取码: z2m8

数据结构与算法知识点总览

leetcode刷题步骤

花五分钟读题思考,没思路直接看题解,比较各种解法优劣。背诵默写好解法;看完解法后马上自己写,在leetcode上提交,修改直到通过。多种解法都要会,体会各种解法、注意优化,比较执行时间;24小时后,再次练习做过的题,温故而知新;一周后,再次练习相同的题目;面试前一周恢复性训练。

时间复杂度的分析

常见的7种复杂度:

O(1): 常数时间复杂度O(log n): 对数时间复杂度O(n): 线性时间复杂度O(n^2): 平方时间复杂度O(n^3): 立方时间复杂度O(2^n): 指数时间复杂度O(n!): 阶乘时间复杂度

时间复杂度的计算:

一般方法:时间复杂度的本质是执行次数,最终这个次数用含有n的表达式表示出来,将这个表达式,省略n前的系数、省略常数、保留n的最高次,即为时间复杂度。

递归情况下的时间复杂度分析:

例:斐波那契数列求第N项值

int fb(int n){if (n < 2) return n;return fb(n - 1) + fb(n - 2);}

以计算第6项为例,展开其调用发现,每一层都是2的n次方个:

时间复杂度为O(2^n), 是很高的时间复杂度,性能极差。看上图可以发现在计算过程中,有大量重复计算,后续在递归的那篇文章,我会给出时间复杂度更低的计算方法,这里只做个引例。

关于递归方程的时间复杂度计算,有个叫做Master Theorem的定理,或者看中文版,可以根据公式直接计算。感兴趣可以研究下,权当拓展。

重要的只有下面这四种:

空间复杂度分析

空间复杂度,就是变量与所占空间的关系

一维数组长度即为空间复杂度O(n),二维数组为O(n^2)递归空间复杂度的分析

leetcode:72.爬楼梯

假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶

我第一次做这道题时,是懵的,乍一看很简单,可是仔细一想,掰手头都算不清。这是因为没有掌握解题的方法,大部分题,都是找重复逻辑点,这里用到了动态规划的方法(当然也有其他解法),后续说到动态规划时再详细说方法,这里先分析空间复杂度。

解决该题的关键在于写出递推方程:

f(n)=f(n−1)+f(n−2)

看这个式子是不是眼熟,是的,就在这篇文章的前面一点,斐波那契求第N项值的递推方程也是这个。

于是可以写出第一个版本的解法,由于申请了一个大小为(n+1)的数组,所以空间复杂度为O(n)。

//C++class Solution {public:int climbStairs(int n) {vector<int> dp(n + 1);dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}};

仔细观察发现,其实我们不需要含有n个元素的那么大的一个数组空间,因为f(n)的值,只依赖两前两项的值,只需设置变量保存这两个值即可,空间复杂度直接从O(n)优化到O(1)。

//C++class Solution {public:int climbStairs(int n) {int first , second , third = 1;for (int i = 1; i <= n; ++i) {first = second; second = third; third = first + second;}return third;}};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。