请选择 进入手机版 | 继续访问电脑版
设为首页 收藏本站
开启辅助访问 快捷导航
菜单
从零开始 资讯 查看内容

全方位的预备数据结构和算法

2020-2-19 20:03 发布者: 大圆镜2015 评论 2 查看 165
一、导读据我了解,程序员有相当一部分对“数据结构”和“算法”的基础概念都不是很清晰,这直接导致很多人在看到有关这部分的内容就会望而却步。实际上,当你了解了“数据结构”和“算法”存在的真正意义,以及一些 ...

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

一、导读

据我领会,法式员有相当一部分对“数据结构”和“算法”的根本概念都不是很清楚,这间接致使很多人在看到有关这部分的内容就会望而生畏。



现实上,当你领会了“数据结构”和“算法”存在的真正意义,以及一些现实的利用处景,对它有了一个整体的认知以后,你能够会对它发生激烈的爱好。固然,它带将带给你的收益也是相当可观的。



很多同学在看到“数据结构”和“算法”后会有一定的抵牾心理,大概尝试去练习,可是被难倒,从而放弃。

这很大一部分缘由是由于你还不够领会进修他们的意义,大概没有把握公道的练习方式。现实上,当你有了一定的目标性,而且有了公道的练习方式,再来进修这部份内容会变得驾轻就熟。

在本文中,我就来分享一下我进修“数据结构”和“算法”的一些经历和方式。

1.1 种别说明

数据结构和算法的品种很是之多,拿树举例,树的品种包括:二叉树、B树、B+树、Trie树、红黑树等等,本文只挑选了二叉树。

对初学者来说,没有需要对某些比力偏的范例息争法多做领会,一是浪费贵重的时候,二是利用的不多。

本文挑选的数据结构和算法的种别均是出现频次最高,以及利用最广的种别。

1.2 题目说明

别的,做题时找对典型题目很是重要,可以让你更快速更高效的把握常识,本文前面也会给出每品种型的典型题目供大师参考。

题目来历:
  • awesome-coding-js:一个前端算法开源项目,包括我做过的题目以及具体剖析
  • leetcode
  • 剑指offer



全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

二、为什么要进修数据结构和算法

在进修某块内容之前,我们一定要首先明白为什么要学,而不是自觉标跟风。

这将更有益于你从进修的进程中获得收益,而且会为你的进修带来动力。

首先明白一点,进修数据结构和算法纷歧定就是记着二叉树、堆、栈、行列等的解题方式也不是融会贯通一些题目,假如你仅仅逗留在这样的概况思惟,那末你进修起来会很是疾苦。

2.1 处理题目标思惟

计较机只是一个很冰冷的机械,你给他下发什么样的指令,它就能作出什么样的反应。

而开辟工程师要做的是若何把现实的题目转化成计较机的指令,若何转化,来看看《数据结构》的典范说法:

设想出数据结构, 在施加以算法就行了。

所以,很重要的一点,数据结构和算法对建立处理题目标思惟很是重要。

假如说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作道理。你完全可以不晓得变速箱怎样工作,就把自动档的车子从 A 开到 B,而且一定就比晓得的人慢。写法式这件事,和开车一样,经历可以起到很高文用,但假如你不晓得底层是怎样工作的,就永久只能开车,既不会修车,也不能造车。假如你对这两件事都不感爱好也就而已,数据结构晓得用就好。但若你今生在编程范畴还有点更高的追求,数据结构是绕不开的课题。

2.2 口试

这是很是现实的一点,也是很多同学进修数据结构和算法的缘由。

一般看待算法的态度会分为以下几类:

Google、 Microsoft等著名外企在口试工程师时,算法是起决议性身分的,根基是每一轮城市考查,即使你有很是强的布景,也有能够由于一两道算法答的欠好而与这样的企业失之交臂。

第二类,算法占重要身分的,国内的某些大厂在口试时,也会把数据结构和算法作为重要的参考身分,根基是口试必考,假如你达不到一定的要求,会间接挂掉。

第三类,起加分感化,很多公司不会把数据结构和算法作为硬性要求,可是也会意味性的出一些题目,当你把一道算法题答的很标致,这绝对是加分项。

可见,学好数据结构和算法对你跳槽更好的公司大概拿到更高的薪水,是很是重要的。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

三、若何预备

领会了数据结构和算法的重要性,那末究竟该用什么样的方式去预备呢?

3.1 全方位领会

在进修和练习之前,你一定要对数据结构和算法做一个全方位的领会,对数据结构和算法的界说、分类做一个周全的了解,假如这部分做的欠好,你在做题时将完全不晓得你在做什么,从而堕入自觉寻觅答案的进程,这个进程很是疾苦,而且常常收益甚微。

本文前面的章节,我会对常见的数据结构和算法做一个全方位的梳理。

3.2 分类练习

当你对数据结构和算法有了一个整体的认知以后,便可以起头练习了。

留意,一定是分类练习!分类练习!分类练习!重要的工作说三遍。

我曾见过很是多的同学带着一腔热血就起头刷题了,从 leetcode第一题起头,刚起头常常很是有动力,能够还会发个朋友圈大概沸点什么的,然后就没有然后了。

由于前几题很是简单,能够会给你一定的自傲,可是,顺次号来的话,很快就会碰到 hard。大概有的人,爽性只刷简单,先把一切的简单刷完。

可是,这样自觉标刷题,结果是很是差的,有能够你对峙下来,刷了几百道,也能有点结果,可是全部进程能够很是慢,而且结果远远没有分类练习要好。

所谓分类练习,即按每各种别练习,例如:这段时候只练习二叉树的题目,前面起头练习回溯算法的题目。

在起头练习之前,你常常还需要对这类具体的种别停止一个具体的领会,对其具体的界说、相关的概念和利用、能够出现的题目范例停止梳理,然后复兴头。

3.3 定期回首和总结

在对一个范例针对练习一些题目以后,你便可以发现一定的纪律,某一些题目是这样解,另一些题目是那样解...这是一个很一般的现象,每品种型的题目必定是存在一定例律的。

这时辰便可以起头对此类题目停止总结了,针对此类题目,以及其典型的题目,发现的解题方式,停止总结。当下次你再碰到这类范例的题目,你就能很快想到解题思绪,从而很快的解答。

所以,当你看到一个题目,首先你要想到它属于哪类数据结构或算法,然后要想到这是一个什么范例的题目,然后是此类题目标处理方式。

假如你看到一个新的题目还不能做到上面这样,那说明你对此类题目标把握水平还不够,你还要多花一些履历来停止练习。

固然,前面我会把我在这部分的总结分享出来,帮助大师少走一些弯路。

3.4 题目标挑选

关于题目来历,这里我保举先看《剑指 offer》,然后是 leetcode,《剑指 offer》上能找到很是多的典型题目,这对你发现和总结纪律很是重要。看完再去刷 leetcode你会发现加倍轻松。

关于难度的挑选, 这里我倡议 leetcode简单、中等难度即可,由于我们要做的是寻觅纪律,即把握典型题目即可,当你把握了这些纪律,再去解一些 hard的题目,也是可以的,只是多花些时候的题目。切忌不要一路头就在很多刁钻怪僻的题目上花费太多时候。

经过上面的方式,我在练习一段时候后,根基 leetcode中等难度的题目可以在 20min内 AC,别的在比来跳槽的进程中,根基一切的算法题目我都能很快的手写出来,大概很快的想到解题思绪。希望大师在看到我的经历和方式后也能到达这样的结果,大概做的比我更好。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

四、时候复杂度和空间复杂度



在起头进修之前,我们首先要搞懂时候复杂度和空间复杂度的概念,它们的凹凸配合决议着一段代码质量的黑白:

4.1 时候复杂度

一个算法的时候复杂度反应了法式运转从起头到竣事所需要的时候。把算法中根基操纵反复履行的次数(频度)作为算法的时候复杂度。

没有循环语句,记作 O(1),也称为常数阶。只要一重循环,则算法的根基操纵的履行频度与题目范围n呈线性增大关系,记作 O(n),也叫线性阶。

常见的时候复杂度有:
  • O(1):Constant Complexity: Constant 常数复杂度
  • O(log n): Logarithmic Complexity: 对数复杂度
  • O(n): Linear Complexity: 线性时候复杂度
  • O(n^2): N square Complexity 平⽅方
  • O(n^3): N square Complexity ⽴立⽅方
  • O(2^n): Exponential Growth 指数
  • O(n!): Factorial 阶乘

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

4.2 空间复杂度

一个法式的空间复杂度是指运转完一个法式所需内存的巨细。操纵法式的空间复杂度,可以对法式的运转所需要的内存几多有个预先估量。

一个法式履行时除了需要存储空间和存储自己所利用的指令、常数、变量和输入数据外,还需要一些对数据停止操纵的工作单元和存储一些为现实计较所需信息的帮助空间。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

五、数据结构

数据结构这个词相信大师都不陌生,在很多场景下能够都听过,但你有没有斟酌过“数据结构”究竟是一个什么工具呢?

数据结构即数据元素相互之间存在的一种和多种特定的关系调集。

一般你可以从两个维度来了解它,逻辑结构和存储结构。

5.1 逻辑结构

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

简单的来说逻辑结构就是数据之间的关系,逻辑结构大要同一的可以分红两种:线性结构、非线性结构。

线性结构:是一个有序数据元素的调集。其中数据元素之间的关系是一对一的关系,即除了第一个和最初一个数据元素之外,别的数据元素都是首尾相接的。

常用的线性结构有: 栈,行列,链表,线性表。

—非线性结构:各个数据元素不再连结在一个线性序列中,每个数据元素能够与零个大概多个其他数据元素发生联系。

常见的非线性结构有 二维数组,树等。

5.2 存储结构

逻辑结构指的是数据间的关系,而存储结构是逻辑结构用计较机说话的实现。常见的存储结构有顺序存储、链式存储、索引存储以及散列存储。

例如:数组在内存中的位置是持续的,它就属于顺序存储;链表是自动建立数据间的关联关系的,在内存中却纷歧定是持续的,它属于链式存储;还有顺序和逻辑上都不存在顺序关系,可是你可以经过一定的方式去放问它的哈希表,数据散列存储。

5.3 数据结构-二叉树

树是用来模拟具有树状结构性质的数据调集。按照它的特征可以分为很是多的品种,对于我们来说,把握二叉树这类结构就充足了,它也是树最简单、利用最普遍的品种。

二叉树是一种典型的树树状结构。如它名字所描写的那样,二叉树是每个节点最多有两个子树的树结构,凡是子树被称作“左子树”和“右子树”。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

5.3.1 二叉树遍历

重点中的重点,最好同时把握递归和非递归版本,递归版本很轻易誊写,可是真正考查根基功的是非递归版本。
  • 二叉树的中序遍历
  • 二叉树的前序遍历
  • 二叉树的后序遍历

按照前序遍历和中序遍历的特点重建二叉树,逆向思维,很成心机的题目
  • 重建二叉树
  • 求二叉树的遍历

5.3.2 二叉树的对称性
  • 对称的二叉树
  • 二叉树的镜像

5.3.3 二叉搜索树

二叉搜索树是特别的二叉树,考查二叉搜索树的题目一般都是考查二叉搜索树的特征,所以把握好它的特征很重要。

1.若肆意节点的左⼦子树不不空,则左⼦子树上一切结点的值均⼩小于它的 根结点的值;

2. 若肆意节点的右⼦子树不不空,则右⼦子树上一切结点的值均⼤大于它的 根结点的值;

3. 肆意节点的左、右⼦子树也别离为⼆二叉查找树。

  • 二叉搜索树的第k个节点
  • 二叉搜索树的后序遍历

5.3.4 二叉树的深度

二叉树的深度为根节点到最远叶子节点的最长途径上的节点数。

平衡二叉树:左右子树深度之差大于1
  • 二叉树的最大深度
  • 二叉树的最小深度
  • 平衡二叉树

5.4 数据结构-链表

用一组肆意存储的单元来存储线性表的数据元素。一个工具存储着自己的值和下一个元素的地址。
  • 需要遍历才能查询到元素,查询慢。
  • 插入元素只需断开毗连重新赋值,插入快。



全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

链表在开辟中也是经常用到的数据结构, React16的 FiberNode毗连起来构成的 FiberTree, 就是个单链表结构。

5.4.1 根基利用

主如果对链表根基概念和特征的利用,假如根本概念把握坚固,此类题目即可水到渠成
  • 从尾到头打印链表
  • 删除链表中的节点
  • 反转链表
  • 复杂链表的复制

5.4.2 环类题目

环类题目即从判定一个单链表能否存在循环而扩大衍生的题目
  • 环形链表
  • 链表环的进口节点
  • 约瑟夫环

5.4.3 双指针

双指针的思惟在链表和数组中的题目都经常会用到,主如果操纵两个或多个分歧位置的指针,经过速度和偏向的变更处理题目。
  • 两个指针从分歧位置动身:一个从始端起头,另一个从结尾起头;
  • 两个指针以分歧速度移动:一个指针快一些,另一个指针慢一些。



对于单链表,由于我们只能在一个偏向上遍历链表,所以第一种情形能够没法工作。但是,第二种情形,也被称为慢指针和快指针技能,是很是有用的。
  • 两个链表的公共节点
  • 链表倒数第k个节点
  • 订交链表

5.4.4 双向链表

双链还有一个援用字段,称为 prev字段。有了这个额外的字段,您就可以晓得当前结点的前一个结点。
  • 扁平化多级双向链表



5.5 数据结构-数组

数组是我们在开辟中最多见到的数据结构了,用于按顺序存储元素的调集。可是元素可以随机存取,由于数组中的每个元素都可以经过数组索引来识别。插入和删除时要移动后续元素,还要斟酌扩容题目,插入慢。

数组与平常的营业开辟联系很是慎密,若何奇妙的用好数组是我们能否开辟出高质量代码的关键。

5.5.1 双指针

上面链表中提到的一类题目,主如果操纵两个或多个分歧位置的指针,经过速度和偏向的变更处理题目。留意这类技能经常在排序数组中利用。
  • 调剂数组顺序使奇数位于偶数前面
  • 和为S的两个数字
  • 和为S的持续正整数序列

5.5.2 N数之和题目

非经常见的题目,根基上都是一个套路,首要斟酌若何比暴利法下降时候复杂度,而且也会用到上面的双指针技能
  • 两数之和
  • 三数之和
  • 四数之和

5.5.3 二维数组

建立一定的笼统建模才能,将现实中的很多题目停止笼统
  • 构建乘积数组
  • 顺时针打印矩阵

5.5.4 数据统计

数组少不了的就是统计和计较,此类题目考查若何用更高效的方式对数组停止统计计较。
  • 数组中出现次数跨越数组长度一半的数字
  • 持续子数组的最大和
  • 扑克牌顺子
  • 第一个只出现一次的字符

5.6 数据结构-栈和行列

在上面的数组中,我们可以经过索引随机拜候元素,可是在某些情况下,我们能够要限制数据的拜候顺序,因而有了两种限制拜候顺序的数据结构:栈(落后先出)、行列(先辈先出)

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165


  • 行列和栈的相互实现
  • 包括min函数的栈
  • 栈的压入弹出序列
  • 滑动窗口最大值
  • 接雨水

5.7 数据结构-哈希表

哈希的根基道理是将给定的键值转换为偏移地址来检索记录。

键转换为地址是经过一种关系(公式)来完成的,这就是哈希(散列)函数。

虽然哈希表是一种有用的搜索技术,可是它还有些弱点。两个分歧的关键字,由于哈希函数值不异,因此被映照到同一表位置上。该现象称为抵触。发生抵触的两个关键字称为该哈希函数的同义词。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165


若何设想哈希函数以及若何避免抵触就是哈希表的常见题目。好的哈希函数的挑选有两条标准:
  • 1.简单而且可以快速计较
  • 2.可以在址空间中获得键的均匀人散布

例以下面的题目:
  • 常数时候插入、删除和获得随机元素

当用到哈希表时我们凡是是要斥地一个额外空间来记录一些计较过的值,同时我们又要鄙人一次计较的进程中快速检索到它们,例如上面提到的两数之和、三数之和等都操纵了这类思惟。
  • 两数之和
  • 三数之和
  • 字符流中第一个不反复的字符
  • 宝石与石头

5.8 数据结构-堆

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

堆的底层现实上是一棵完全二叉树,可以用数组实现
  • 每个的节点元素值不小于其子节点 - 最大堆
  • 每个的节点元素值不大于其子节点 - 最小堆

堆在处置某些特别场景时可以大大下降代码的时候复杂度,例如在庞大的数据中找到最大的几个数大概最小的几个数,可以借助堆来完成这个进程。
  • 堆的根基操纵
  • 数据流中的中位数
  • 最小的k个数



全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

六、算法



6.1 排序

排序也许是大师打仗最多的算法了,很多人的算法之路是从一个冒泡排序起头的,排序的方式有很是多中,它们各自有各自的利用处景和优弱点,这里我保举以下6种利用最多的排序方式,假如你有爱好也可以研讨下其他几种。
  • 快速排序

挑选一个方针值,比方针值小的放左侧,比方针值大的放右侧,方针值的位置已排好,将左右两侧再停止快排。
  • 合并排序

将大序列二分红弁言列,将弁言列排序后再将排序后的弁言列合并成大序列。
  • 挑选排序

每次排序取一个最大或最小的数字放到前面的有序序列中。
  • 插入排序

将左侧序列看成一个有序序列,每次将一个数字插入该有序序列。插入时,从有序序列最右侧起头比力,若比力的数较大,后移一位。
  • 冒泡排序

循环数组,比力当前元素和下一个元素,假如当前元素比下一个元素大,向上冒泡。下一次循环继续上面的操纵,不循环已经排序好的数。
  • 堆排序

建立一个大顶堆,大顶堆的堆顶一定是最大的元素。交换第一个元素和最初一个元素,让残剩的元素继续调剂为大顶堆。从后往前以此和第一个元素交换并重新构建,排序完成。

6.2 二分查找

查找是计较机中最根基也是最有用的算法之一。它描写了在有序调集合搜索特定值的进程。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

二分查找保护查找空间的左、右和中心指示符,并比力查找方针或将查找条件利用于调集的中心值;假如条件不满足或值不相称,则断根方针不成能存在的那一半,并在剩下的一半上继续查找,直到成功为止。假如查以空的一半竣事,则没法满足条件,而且没法找到方针。
  • 二维数组查找
  • 扭转数组的最小数字
  • 在排序数组中查找数字
  • x 的平方根
  • 猜数字巨细

6.3 递归

递归是一种处理题目标有用方式,在递归进程中,函数将本身作为子例程挪用。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

你能够想晓得若何实现挪用本身的函数。窍门在于,每当递归函数挪用本身时,它城市将给定的题目拆解为子题目。递归挪用继续停止,直到到子题目无需进一步递归便可以处理的境界。

为了确保递归函数不会致使无穷循环,它应具有以部属性:


  • 一个简单的根基案例 —— 可以不利用递归来发生答案的停止计划。
  • 一组法则,也称作递推关系,可将一切其他情况拆分到根基案例。

6.3.1 反复计较

一些题目利用递归斟酌,思绪是很是清楚的,可是却不保举利用递归,例以下面的几个题目:
  • 斐波拉契数列
  • 跳台阶
  • 矩形覆盖

这几个题目利用递归都有一个配合的弱点,那就是包括大量的反复计较,假如递归条理比力深的话,间接会致使JS进程解体。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

你可以利用 记忆化的方式来避免反复计较,即斥地一个额外空间来存储已经计较过的值,可是这样又会浪费一定的内存空间。是以上面的题目一般会利用静态计划求解。

所以,在利用递归之前,一定要判定代码能否含有反复计较,倘使有的话,不保举利用递归。

递归是一种思惟,而非一个范例,很多典范算法都是以递归为根本,是以这里就不再给出更多题目。

6.4 广度优先搜索

广度优先搜索( BFS)是一种遍历或搜索数据结构(如树或图)的算法,也可以在更笼统的场景中利用。

它的特点是越是接近根结点的结点将越早地遍历。

例如,我们可以利用 BFS 找到从肇端结点到方针结点的途径,出格是最长途径。

在 BFS中,结点的处置顺序与它们增加到行列的顺序是完全不异的顺序,即先辈先出,所以广度优先搜索一般利用行列实现。
  • 从上到下打印二叉树
  • 单词接龙
  • 员工的重要性
  • 岛屿数目

6.5 深度优先搜索

和广度优先搜索一样,深度优先搜索( DFS)是用于在树/图中遍历/搜索的一种重要算法。

与 BFS 分歧,更早拜候的结点能够不是更靠近根结点的结点。是以,你在 DFS 中找到的第一条途径能够不是最长途径。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

在 DFS中,结点的处置顺序是完全相反的顺序,就像它们被增加到栈中一样,它是落后先出。所以深度优先搜索一般利用栈实现。
  • 二叉树的中序遍历
  • 二叉树的最大深度
  • 途径总和
  • 课程表
  • 岛屿数目

6.6 回溯算法

从处理题目每一步的一切能够选项里系统挑选出一个可行的处理计划。

在某一步挑选一个选项后,进入下一步,然前面临新的选项。反复挑选,直至到达终极状态。

回溯法处理的题目标一切选项可以用树状结构暗示。
  • 在某一步有n个能够的选项,该步调可看做树中一个节点。
  • 节点每个选项看成节点连线,到达它的n个子节点。
  • 叶节点对应终结状态。
  • 叶节点满足约束条件,则为一个可行的处理计划。
  • 叶节点不满足约束条件,回溯到上一个节点,并尝试其他叶子节点。
  • 节点一切子节点均不满足条件,再回溯到上一个节点。
  • 一切状态均不能满足条件,题目无解。



全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

回溯算法合适由多个步调组成的题目,而且每个步调都有多个选项。
  • 二叉树中和为某一值的途径
  • 字符串的排列
  • 和为sum的n个数
  • 矩阵中的途径
  • 机械人的活动范围
  • N皇后题目

6.7 静态计划

静态计划常常是最能有用考查算法和设想才能的题目范例,面临这类题目最重要的是捉住题目标阶段,领会每个阶段的状态,从而分析阶段之间的关系转化。

适用于静态计划的题目,需要满足最优子结构和无后效性,静态计划的求解进程,在于找到状态转移方程,停止自底向上的求解。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

自底向上的求解,可以帮你省略大量的复杂计较,例如上面的斐波拉契数列,利用递归的话时候复杂度会呈指数型增加,而静态计划则让此算法的时候复杂度连结在 O(n)。

6.7.1 途径题目
  • 最小途径和
  • 分岔途径
  • 分岔途径 II
  • 构成字符串的最长途径

6.7.2 买卖股票类题目
  • 买卖股票的最好机会
  • 买卖股票的最好机会 III
  • 打家劫舍
  • 打家劫舍 II

子序列题目
  • 分歧的子序列
  • 乘积最大子序列
  • 最长上升子序列
  • 最长回文子序列

6.8 贪心算法

贪心算法:对题目求解的时辰,总是做出在当前看来是最好的做法。

适用贪心算法的场景:题目可以分化成子题目来处理,子题目标最优解能递推到终极题目标最优解。这类子题目最优解成为最优子结构



全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

6.8.1 买卖股票类题目
  • 买卖股票的最好机会 II
  • 买卖股票的最好机会含手续费

6.8.2 货币挑选题目
  • 零钱兑换
  • 零钱兑换 II

6.9 贪心算法、静态计划、回溯的区分

贪心算法与静态计划的分歧在于它对每个子题目标处理计划都作出挑选,不能回退,静态计划则会保存之前的运算成果,并按照之前的成果对当进步行挑选,有回退功用,而回溯算法就是大量的反复计较来获得最优解。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

有很多算法题目都是可以用这三种思惟同时解答的,可是总有一种最合适的解法,这就需要不竭的练习和总结来停止深入的了解才能更好的挑选处理法子。

全方位的预备数据结构和算法_资讯_2020-2-19 20:03发布_从零开始_165

七、小结



本文并没有对每个点停止深入的分析,而是从为什么、怎样做、做什么的角度对数据结构和算法停止的周全分析,希望看完本片文章能对你有以下帮助:
  • 对数据结构和算法建立一个较周全的认知系统
  • 把握快速进修数据结构和算法的方式
  • 领会数据结构和算法的重要分类和典范题型

鲜花

握手

雷人

路过

鸡蛋
收藏 分享 邀请

相关阅读

发表评论

最新评论

简0 2020-2-19 20:04
平衡二叉树的概念应该是左右子数深度之差的绝对值小于1
孙悟空748 2020-2-19 20:03
写得很用心,绝不是简单的CP操作……

查看全部评论(2)

一周热门

头条攻略!

日排行榜

相关分类