前端视角学习《数据结构与算法》,包括数据结构的理解,算法解题技巧,Leetcode 经典题解,欢迎讨论!
🐧 前情提要
阅读本章节你会了解到以下内容:
- 前端为什么学算法
- 学算法前的思考
- 如何学算法刷 LeetCode
- 小结
1. 前端为什么学算法
目前学习并学会数据结构和算法,对于大多数的程序员成了一项必备的技能。其中最根本的一个原因是,面试的时候会考。此外,那学习数据结构和算法,对我们来说,有什么用呢?
首先,算法是计算机语言中最基本的规则,编程时了解使用的数据结构,在此基础上构建高效的算法,对你构建思维方式,设计模式有很大的帮助。其次,阅读框架源码时,能够帮助你读懂并理解框架的设计思路,因为很多框架如 React、Vue 中虚拟DOM,fiber树、jsx解析、缓存模块,diff算法等都是用到了常用的算法。
因此,学习数据结构和算法,能够帮助你在前端赛道中走的更远...
2. 学算法前的思考
学数据结构和算法有一个多月了,基本上从零开始学起的。从开始最难熬的时候,逐渐过渡到大致掌握了常见的数据结构和算法,解 LeetCode 简单中等题有思路,能看得懂大部分题解,但完全提交通过还差很多的程度。能有这样的进步,个人觉得最重要的就是坚持,其次是找对学习方法。
学习方法就是前进的方向,方向对了,持续的坚持就能带你走的更远,直至到达目的地。
3. 如何学算法
学数据结构和算法前期,是最难熬的阶段。因为你不知道怎么开始,我当时在知乎、掘金等各个渠道看了很多学算法的经验贴。大家学算法的路径很多,有的推荐看算法基础书,有的推荐直接刷 LeetCode 题,有的推荐看 YouTube、B站的算法讲解的视频... 试了几种方式之后,发现可能并不适合我,因为本身开始学算法就是痛苦的,再加上没有选对一种适合自己上手的学习方法更痛苦。
现在回顾整个过程,学算法和学初高中数学方法很类似。
1)先学并理解常见数据结构和算法
学数学的时候,我们会跟着教材,了解最基本的概念,如整数、分数、方程、不等式等,了解概念的基础上,又学了基本公式,如勾股定理、三角函数、数列解法、排列组合等。学习这些的目的是,解决数学问题,应用题,解析几何,概率论等,这些问题包含了很多数据概念、公式、解题公式。学最基本的概念时候,先理解这个数据结构和算法结构是什么,如何实现的,学完一个知识点之后,找 1-2 道简单经典题练练手,了解个大概。
说回算法,作为前端工程师,需要掌握的数据结构和算法如下:
- 数据结构:数组、链表、树、栈、队列...
- 算法:二分查找、贪心、动态规划、递归回溯、双指针、排序、搜索...
2)分类刷 leetcode 题,总结每种题型的解题公式
在基本掌握了最常见的数据结构和算法之后,开始分类做题。分类做题的好处在于,能在短时间内强化该数据结构或算法的解题套路。比如,我这一周要深入学习树,那就在 LeetCode 上先找所有标签是二叉树的题刷,前期可以先找简单经典的题,先看自己是否有思路,有思路就试下暴力解法,做 5-10 分钟卡住了,一定要停下来,找官方或热度高的题解来看,重点不是看如何解这一道题,而是解相似题的思路和套路,有什么通用公式。文字版看不懂,可以搜 B站上 JavaScript in LeetCode 讲解视频来看。刷题达到一定量,看题解分享总结解题公式,反复用的多了,刷题自然就会顺利一些。
简单列举下某个数据结构的学习思路,比如树:
- 分类:
- 二叉树
- 二叉搜索树
- 题型:
- 二叉树的遍历(包括前序、中序、后序、层序...)
- 二叉树的操作(包括合并、翻转、比较、是否对称...)
- 二叉树的属性(包括最小深度、最大深度、直径...)
- 解题套路:
- DFS 深度优先遍历 + 递归
- BFS 广度优先遍历 + 队列/栈
3)大量刷题
之前看了各种 LeetCode 刷题的经验贴,前期不是在刷题,而是在读懂题目,并且看懂题解,因为开始做题大多数是没有思路的。在反复经历了上述步骤 2)之后,掌握了基本的题型解题套路,才开始刷题阶段,从 0-100 题是学习的过程,100-200 题是巩固的过程,200 往上逐渐进入刷题的过程,直到最后完全就是默写公式,灵活使用公式变形。
整体也是从难熬到逐渐快乐的过程,所以,还是那句话一定要坚持住!
4. 小结
- 明确学习算法的目的,有限时间内制订短期目标
- 找到适合自己学习方法,持续坚持
- 前期学习常见数据结构和算法
- 分类刷 LeetCode,总结题型,解题公式
- 大量刷题,深入巩固,灵活运用解题公式
最后,想通过前端学算法这个专栏,帮助自己记录学习数据结构和算法的过程。
学习有时是寂寞行路,当你翻越一座大山之后,它会带给你瞬间的喜悦、收获、回忆、甚至疲惫。而望山兴叹的人却无法体会站在山顶时俯瞰一切时的心情,因为它仅会永远停留在想象中,只有你自己知道经历了什么。但愿我能翻越算法这座大山!