最近好多事情,最近前端分享会也如期而至,有幸此次分享会,正好周末有时间,作个总结吧。前端
此次想分享的就是算法与数据结构,刷了一段时间题目,逛了逛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))
复制代码
对于这部分的算法而言,能够围绕从解题思路-->>实现过程-->>代码实现。 基本上以这三步来实现的话,掌握常见的排序算法完成是没有问题的。
那么这部分就暂时梳理到这里吧。
动态规划难,能够说是不少面试者也是我最怕的部分,尤为是面试的时候,怕面试官考这个算法了。遇到没有作过的题目,这个时候,可否写出状态转移方程是十分重要的。接下来咱们聊一聊这个专题吧。
首先,强烈推荐我以前分析这个专题如何准备的: 「算法与数据结构」一张脑图带你看动态规划算法之美
若是从点赞角度来看,能够说,是我写算法以来,获得你们确定最多的一次了,能够看看,不过这里也会涵盖部分。
如何学动态规划,从哪里入手,应该这么去作,这么去刷题,确定是不少初学者一开始就会遇到的问题。
首先,你得了解动态规划是什么,它的思想是什么,定义又是啥。这里引入维基百科对它的定义:
Wikipedia 定义:它既是一种数学优化的方法,同时也是编程的方法。
固然了,看完这段话,咱们确定对它不了解的,咱们能够翻译一下,首先它能够算是一种优化的手段,优化一些重复子问题的操做,将不少重叠子问题经过编程的方式来解决,好比记忆划搜索。 又好比,若是一个原问题,能够拆分红不少子问题,它们之间没有任何后续性,当前的决策对后续没有影响的话,每一个子问题的最优解,就能够组合成原问题的最优解了。
固然了,对于动态规划每一个人理解是不一样的,对于应用到具体的场景中,须要咱们都去用多维度的状态去表述它的含义,这里也就是状态转移方程的含义所在。
嗯,那么动态规划解决了什么问题呢,很显然,对于重复性问题来讲,它能够很好的解决,那么从某个维度上来看,它能够优化一个算法的时间复杂度,也就是一般意义上的,拿空间来换取时间的操做。
动态规划解题步骤: 这个应该就是实际落地的操做,须要咱们去经过大量的题目来完成,具体咱们须要怎么作呢?
解题思路,三大步骤👇
「算法与数据结构」一张脑图带你看动态规划算法之美强烈推荐这篇问题,里面讲的很清楚了。
如何高效率刷dp专题:首先,你得找到对应的dp专题,这里的话,我帮你准备好了,接下来我说一下我是怎么刷leetcode上面的题目的。
通常而言,刷完中等的leetcode上的dp专题,基本上能够知足要求了。那么对于中等的dp题目,不少时候,我是写不吃来的,那我应该如何去作呢?
还有,我我的建议,刷dp的话,最好从易到难,这样子本身也会有信心,也不会再去畏惧它。
如下是我收集的部分题目,但愿对大家有帮助。
这部分也是尤为重要的,那么重点学习深度优先搜索算法(简称为 DFS)和广度优先搜索算法(简称为 BFS)。
我翻了翻个人博客,刚好有一篇相似的问题,你们能够看看**「算法与数据结构」DFS和BFS算法之美**。
不过,我看了一下,我当时写得时候,有点粗糙,不少基本的概念都没有讲明白,因此可能适合一些对这部分有基础的小伙伴。
在这里推荐一个有趣的题目:
若是你也遇到过迷宫相似的问题,就能够考虑搜索算法了,从我我的的角度来讲,它的思路其实就是模拟人的思路,每次走到一个路口的时候,我能够走哪里,我以前走过的路,怎么确保,接下来是不能走的,这里须要在编程的角度,如何去实现呢?
这里说一说个人经验,对于刚刚提到的题目而言,我盲猜使用BFS,题目作多了,天然就会有心得,对于BFS和DFS而言,作了两个相似的题目,会发现,原来搜索算法也是有迹可循,也是存在某些套路的。
给些建议:
一开始可能作的时候,抓不到头脑,有思路,可是代码很难写清楚,那么如何去作呢? 看题解,了解别人的写法是很不错的,能够多个对比,看看哪一份题解代码是你目前能够理解的,而后抄下来,看一遍。
最普通的办法就是:先画图,看看思惟上跟实际代码须要作哪些改变,如何去优化这个过程。最后结合别人代码,必定不要直接copy,不去思考为何这么写,否则后期发现,是没有多大效果的,必定要多结合本身的理解。
嗯,不会就看题解,多思考为何这么写!!!
写到这里的时候,已经凌晨1点了,算法与数据结构这个方向太大了,一篇文章不可能写得完,我更但愿这篇文章对你,有那么一点点的帮助,对我,或你都些许有所帮助,那么它得存在就有那么一点点意义。
如下是我刷的题集,需者自取,公众号:前端UpUp,关注它,找我领pdf文档也能够。
这个专题想进阶,就刷我下面提供的题目吧👇
我以前刷题历程是根据这套题来的,我以为里面题目梯度仍是质量都是很不错的。
拿到这个pdf有段时间了,因此不清楚具体做者是谁,有侵权的话,可删。
简单
中等
简单
中等
简单
中等
简单
中等
困难
简单
中等
简单
中等
困难
简单
中等
困难
简单
中等
困难
中等
简单
困难
简单
中等
困难
简单
中等
简单
中等
困难
简单
中等
简单
中等
困难
简单
中等
简单
中等
困难
若是你以为这篇内容对你挺有有帮助的话: