「算法与数据结构」你可能须要的一份前端算法总结

前言

最近好多事情,最近前端分享会也如期而至,有幸此次分享会,正好周末有时间,作个总结吧。前端

此次想分享的就是算法与数据结构,刷了一段时间题目,逛了逛LeetCode,看了不少关于这个方面的文章,有所感悟,准备作个记录吧。node

当你想花时间去了解学习一件对你来讲,很苦难的事情的时候,咱们须要明确目标,学习它的意义,它有什么用,对你有哪方面帮助。面试

升职加薪必备,对之后成长有所帮助,嗯,加薪,加薪,加薪。算法

那么问题来了,为何要进大厂呢⬇️编程

年轻时候去大厂的目标,是为了不,【你得顿悟,是别人的基本功】数组

嗯,闲聊就止步于此,接下来开始吧~安全

站在巨人肩膀上,学起来就很轻松了, 这里我是参考网上的算法刷题路线,能够参考一下~markdown

公众号前端UpUp,回复算法,便可获取脑图,以及文末的题目汇总pdf。cookie

算法与数据结构

接下来,咱们就根据这个脑图来梳理一遍吧~数据结构


数据结构

数据结构能够说是算法的基石,若是没有扎实的数据结构基础,想要把算法学好甚至融会贯通是很是困难的,而优秀的算法又每每取决于你采用哪一种数据结构。学好这个专题也是颇有必要的,那么咱们能够稍微的作个分类。

  • 经常使用数据结构

    • 数组,字符串
    • 链表
    • 队列
  • 高级数据结构

    • 前缀树
    • 线段树
    • 树状数组
    • 主席树

那么显然,最多见的数据结构必定是须要掌握的,对于高级的数据结构而言,若是你有时间,对它有所热爱的话,能够深刻了解,好比这个主席树在解决一些问题 的时候,算法复杂度是log级别的,某些场景下颇有帮助。

这里想说起的就是。它的结构很显然是很直观的,树固然有不少的性质,这里也列举不完,好比面试中常考的树:

普通二叉树、平衡二叉树、彻底二叉树、二叉搜索树、四叉树(Quadtree)、多叉树(N-ary Tree)。

对于它而言的话,咱们须要到哪些程度呢?

对于常见树的遍历,从树的前序遍历,到中序遍历,后续遍历,以致于层次遍历,掌握好这四种遍历的递归写法和非递归写法是很是重要的,接下来须要懂得分析各类写法的时间复杂度和空间复杂度。

面试准备阶段,把树这个结构花时间去准备的话,对于你理解递归仍是颇有帮助的,同时也能帮助你学习一些图论的知识,更加准确的说,树是面试考察的热门考点,尤为是二叉树!

掌握好这些数据结构是基础,绝大部分的算法面试题都得靠它们来帮忙,所以,必定要花功夫勤练题目来深刻理解它们。


排序算法

这应该是面试最常考,最核心的算法。若是你能把排序算法理解的很透彻的话,接下来的其余算法也是同样的旁敲侧击。

当时我梳理得是常见的6个排序算法:

在此以前,我也写过一篇排序算法的文章,我的以为言简意赅,能够看看「算法与数据结构」梳理6大排序算法

有时候,面试官喜欢会问冒泡排序和插入排序,基本上这些都是考察你的基础知识,而且看看你能不能快速地写出没有bug的代码。

又好比,当面试官问你归并排序、快速排序和拓扑排序等的时候,这个时候考察的是你平时对算法得积累,因此有必要作个总结。

咱们拿归并排序来举例子,咱们应该如何表达清楚呢?首先,咱们应该把这个它的思路说清楚:

归并排序的核心思想就是分治,它将一个复杂的问题分红两个或者多个相同或类似的子问题,而后把子问题分红更小的子问题,直到子问题能够简单的直接求解,最原问题的解就是子问题解的合并。归并排序将分治的思想体现得淋漓尽致。

当你向面试官理清楚这个思路时,面试官内心就有底了,他会想,嘿,这个小伙子不错!那你接下来都有底气了!

有了思想,那么实现起来就不难了:

一开始先把数组从中间划分红两个子数组,一直递归地把子数组划分红更小的子数组,直到子数组里面只有一个元素,才开始排序。

排序的方法就是按照大小顺序合并两个元素,接着依次按照递归的返回顺序,不断地合并排好序的子数组,直到最后把整个数组的顺序排好。

贴一份以前的代码:

const merge = (left, right) => { // 合并数组

    let result = []
    // 使用shift()方法偷个懒,删除第一个元素,而且返回该值
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift())
        } else {
            result.push(right.shift())
        }
    }
    while (left.length) {
        result.push(left.shift())
    }

    while (right.length) {
        result.push(right.shift())
    }
    return result
}

let mergeSort = function (arr) {
    if (arr.length <= 1)
        return arr
    let mid = Math.floor(arr.length / 2)
    // 拆分数组
    let left = arr.slice(0, mid),
        right = arr.slice(mid);
    let mergeLeftArray = mergeSort(left),
        mergeRightArray = mergeSort(right)
    return merge(mergeLeftArray, mergeRightArray)
}

// let arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2]
// console.log(mergeSort(arr))
复制代码

对于这部分的算法而言,能够围绕从解题思路-->>实现过程-->>代码实现。 基本上以这三步来实现的话,掌握常见的排序算法完成是没有问题的。

那么这部分就暂时梳理到这里吧。


动态规划

动态规划难,能够说是不少面试者也是我最怕的部分,尤为是面试的时候,怕面试官考这个算法了。遇到没有作过的题目,这个时候,可否写出状态转移方程是十分重要的。接下来咱们聊一聊这个专题吧。

首先,强烈推荐我以前分析这个专题如何准备的: 「算法与数据结构」一张脑图带你看动态规划算法之美

若是从点赞角度来看,能够说,是我写算法以来,获得你们确定最多的一次了,能够看看,不过这里也会涵盖部分。

如何学动态规划,从哪里入手,应该这么去作,这么去刷题,确定是不少初学者一开始就会遇到的问题。

  • 概念
  • 动态规划解决了什么问题
  • 动态规划解题的步骤
  • 如何高效率刷dp专题

首先,你得了解动态规划是什么,它的思想是什么,定义又是啥。这里引入维基百科对它的定义:

Wikipedia 定义:它既是一种数学优化的方法,同时也是编程的方法。

固然了,看完这段话,咱们确定对它不了解的,咱们能够翻译一下,首先它能够算是一种优化的手段,优化一些重复子问题的操做,将不少重叠子问题经过编程的方式来解决,好比记忆划搜索。 又好比,若是一个原问题,能够拆分红不少子问题,它们之间没有任何后续性,当前的决策对后续没有影响的话,每一个子问题的最优解,就能够组合成原问题的最优解了。

固然了,对于动态规划每一个人理解是不一样的,对于应用到具体的场景中,须要咱们都去用多维度的状态去表述它的含义,这里也就是状态转移方程的含义所在。

嗯,那么动态规划解决了什么问题呢,很显然,对于重复性问题来讲,它能够很好的解决,那么从某个维度上来看,它能够优化一个算法的时间复杂度,也就是一般意义上的,拿空间来换取时间的操做。

动态规划解题步骤: 这个应该就是实际落地的操做,须要咱们去经过大量的题目来完成,具体咱们须要怎么作呢?

解题思路,三大步骤👇

  1. 状态定义
  2. 列出状态转移方程
  3. 初始化状态

「算法与数据结构」一张脑图带你看动态规划算法之美强烈推荐这篇问题,里面讲的很清楚了。

如何高效率刷dp专题:首先,你得找到对应的dp专题,这里的话,我帮你准备好了,接下来我说一下我是怎么刷leetcode上面的题目的。

通常而言,刷完中等的leetcode上的dp专题,基本上能够知足要求了。那么对于中等的dp题目,不少时候,我是写不吃来的,那我应该如何去作呢?

  • 首先,我先看题解,把它的状态转移方程写下来,仔细的品味一下,它这么定义,解决了我以前的什么难点,为啥我是没有想到的。
  • 而后,看完以后,尝试按照这个题解思路,我本身能不能单独实现呢?
  • 若是不能的话,就照着它的代码,写一遍,多看看状态转移方程是如何写的,把这个题目收藏起来。
  • 等到下次,或者是隔天,再来看一遍题目,而后看看能不能单独完成,若是不能,第三天再这么操做。

还有,我我的建议,刷dp的话,最好从易到难,这样子本身也会有信心,也不会再去畏惧它。

进阶题目汇总

如下是我收集的部分题目,但愿对大家有帮助。

简单


中等


困难


搜索算法

这部分也是尤为重要的,那么重点学习深度优先搜索算法(简称为 DFS)和广度优先搜索算法(简称为 BFS)。

我翻了翻个人博客,刚好有一篇相似的问题,你们能够看看**「算法与数据结构」DFS和BFS算法之美**。

不过,我看了一下,我当时写得时候,有点粗糙,不少基本的概念都没有讲明白,因此可能适合一些对这部分有基础的小伙伴。

在这里推荐一个有趣的题目:

穿过迷宫的最少移动次数

若是你也遇到过迷宫相似的问题,就能够考虑搜索算法了,从我我的的角度来讲,它的思路其实就是模拟人的思路,每次走到一个路口的时候,我能够走哪里,我以前走过的路,怎么确保,接下来是不能走的,这里须要在编程的角度,如何去实现呢?

这里说一说个人经验,对于刚刚提到的题目而言,我盲猜使用BFS,题目作多了,天然就会有心得,对于BFS和DFS而言,作了两个相似的题目,会发现,原来搜索算法也是有迹可循,也是存在某些套路的。

给些建议:

一开始可能作的时候,抓不到头脑,有思路,可是代码很难写清楚,那么如何去作呢? 看题解,了解别人的写法是很不错的,能够多个对比,看看哪一份题解代码是你目前能够理解的,而后抄下来,看一遍。

最普通的办法就是:先画图,看看思惟上跟实际代码须要作哪些改变,如何去优化这个过程。最后结合别人代码,必定不要直接copy,不去思考为何这么写,否则后期发现,是没有多大效果的,必定要多结合本身的理解。

嗯,不会就看题解,多思考为何这么写!!!


写到这里的时候,已经凌晨1点了,算法与数据结构这个方向太大了,一篇文章不可能写得完,我更但愿这篇文章对你,有那么一点点的帮助,对我,或你都些许有所帮助,那么它得存在就有那么一点点意义。

如下是我刷的题集,需者自取,公众号:前端UpUp,关注它,找我领pdf文档也能够。

进阶题目汇总

这个专题想进阶,就刷我下面提供的题目吧👇

DFS

BFS


题目汇总

我以前刷题历程是根据这套题来的,我以为里面题目梯度仍是质量都是很不错的。

拿到这个pdf有段时间了,因此不清楚具体做者是谁,有侵权的话,可删。

数组&链表

简单

中等

Map & Set

简单

中等

堆栈&队列

简单

中等

二分查找

简单

中等

困难

递归

简单

中等

哈希表

简单

中等

困难

二叉树

简单

中等

困难

二叉搜索树

简单

中等

困难

中等

堆和排序

简单

困难

DFS

简单

中等

困难

BFS

简单

中等

Trie树

简单

中等

困难

分治算法

简单

中等

回溯算法

简单

中等

困难

贪心算法

简单

中等

动态规划

简单

中等

困难


❤️ 感谢你们

若是你以为这篇内容对你挺有有帮助的话:

  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  2. 关注公众号前端UpUp,联系做者👉 DayDay2021 ,咱们一块儿学习一块儿进步。
  3. 以为不错的话,也能够阅读TianTian近期梳理的文章(感谢掘友的鼓励与支持🌹🌹🌹):
相关文章
相关标签/搜索