我要学习下去 ~~

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

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

死磕碎碎念:

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

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

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

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

背诵代码

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

链接: https://pan.baidu.com/s/1BDuhyvMahWNI0malB4BvLQ 提取码: z2m8

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

leetcode刷题步骤

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

时间复杂度的分析

常见的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的定理,或者看中文版,可以根据公式直接计算。感兴趣可以研究下,权当拓展。

重要的只有下面这四种:

空间复杂度分析

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

  1. 一维数组长度即为空间复杂度O(n),二维数组为O(n^2)
  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;}
};

[第1节]时间、空间复杂度,斐波那契、爬楼梯相关推荐

  1. 计算机斐波那流程图,循环结构——斐波那契数列.DOC

    循环结构--斐波那契数列 循环结构--斐波那契数列 1.教学目标 根据新课标的要求和学生的认知特点,确定本节课的教学目标. (1)知识与技能 学生能理解循环结构概念:把握循环结构的三要素:循环的初始状 ...

  2. 【数据结构】递归斐波那契数列的时间复杂度、空间复杂度

    递归斐波那契数列的时间复杂度相对于循环等函数而言并不容易看出来,下面通过斐波那契数列的程序进行图解: long long Fib(size_t N) {if (N < 3)return 1;re ...

  3. Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)

    Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...

  4. 递归时间/空间复杂度的分析(斐波那契为例)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  5. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  6. 斐波那契数的时间复杂度、空间复杂度详解

     斐波那契数:斐波那契数列指的是1.1.2.3.5.8.13.21.······这样一个数列,我们可以发现它后面的一个数是前两个数之和.而在这个数列中的数就被称为斐波那契数. 时间复杂度:时间复杂 ...

  7. 时间复杂度 ( 递归实现阶乘、斐波那契数列第n个数) / 空间复杂度

    1 时间复杂度   时间复杂度是衡量程序运行的快慢,对于一个程序来说,运行速度的快慢,有很多干扰因素,不同的硬件条件都可能影响到速度的快慢.时间复杂度来衡量,不是精确的衡量,只是单纯从代码本身衡量程序 ...

  8. 斐波那契数列三种方法计算,光棍节快乐

    //斐波那契数列三种方法计算 //Fibnacci(0)=0 //Fibnacci(1)=1 //Fibnacci(n)=Fibnacci(n-1)+Fibnacci(n-2)  [n>1] / ...

  9. 斐波那契数与二分法的递归与非递归算法及其复杂度分析

    1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...

最新文章

  1. oracle 开窗子句,分析函数和开窗函数
  2. 如何提高创作型任务的效率?
  3. 七、前端开发-JavaScript HTTP
  4. 口罩告急,全民互助!“口罩互助”小程序重磅上线!
  5. vs中c++项目的配置
  6. 2016年光伏电站交易和融资的十大猜想
  7. springboot ServletContextListener接口
  8. 记录报错:java.lang.NullPointerException org.apache.jsp.test_jsp._jspInit(test_jsp.java:23)
  9. DirectAdmin面板在线解压缩的.tar.gz文件
  10. typedef的4种常见用法
  11. Pygame制作音乐播放器
  12. iphone8 android传文件,如何从iPhone或Android将数据传输到新的iPhone 8
  13. 好用的Web前端开发框架有哪些呢?推荐这9款
  14. 1、定义一个复数类Complex,使得下面的代码能够工作。 Complex c1(3,5); Complex c2=4.5; c1.add(c2); c1.show();
  15. mysql 按中文字段排序
  16. Python笔记:利用pygame模块实现三原色颜色滚动条效果
  17. 人工智能 自动化测试_测试中的AI:第三波自动化
  18. 苹果电脑硬盘损坏数据是否可以恢复
  19. 一个巨型的ESP8266模块,围观围观
  20. PHP:overtrue/pinyin 中文转拼音工具

热门文章

  1. chrome浏览器加载css、js等静态资源文件的坑
  2. JQuery——实现Ajax应用
  3. UITextField监控文字变化方法
  4. 使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
  5. 2016OSC源创会年终盛典-前端技术专场-阴明
  6. @AuotoWired+@Qualifier(百度百科)
  7. nodejs express 学习
  8. source命令执行SQL脚本文件
  9. 笔记本安装CentOS环境
  10. vsftpd 可以登录,无法写入和上传