# 碎碎念

作为前端来说可能并不太需要很深的数据结构与算法理解,因为平时大多时间打交道的不是数据而是 ui,但作为一个程序员,要想编写出色的程序代码或是造出强大有用的工具,都离不开对数据结构与算法的掌握与理解。

# 递归与树

作为刷力扣入门的菜鸟,经历了顺序表洗礼与折磨,又与散列表和集合快乐地斩杀数题之后,终于到了即将要面对的一个大山 -- ,一开始我对树是没有耐心的,觉得并不是一个很重要的东西,对于前端来说,过一下基础知识之后就算 ok 了,但后来发现树也是前端领域乃至程序员领域的一个思想盛宴,著名前端框架 vue、react 的实现都离不开树的思想,如将 dom 树转变为虚拟 dom 树,也就是深层的嵌套对象,然后对对象进行增删改查,或是对其的子节点套用一些诸如 watch(观察者)、生命周期钩子、数据响应式等操作,这些操作都离不开对树这一数据结构以及其算法的思想。

刚开始学习树一定少不了递归这个概念,递归其实并不属于数据结构算法这一范畴,而是属于编程基础中函数这一块知识点,而我将他与树绑定在一块,是鉴于其思想与树思想不谋而合。在多次攻克树相关的题目时,绝大多数的题目都用到了递归的思想,甚至在一些非树的题目中,用到的递归,其问题的形式也可以抽象成一棵树。就如剑指 offer12 题矩阵中的路径一题,里面用到的递归,将每一点依次作为起点,每次往四个方向走,走到的四个格子又可以以此为点继续往四个方向走,这种递归的思想我们就可以将其抽象为一个四叉树,一层层往下递归,直到走到尽头,然后再往回 return 想要的结果。所以说,绝大多数的树题可以用递归解决,而绝大多数的递归问题,也可以抽象成树,让思路更加清晰。

Tip:如何解决冲突?HashMap

# 链表的虚拟头节点

许多链表题都会让我们去改变链表,而链表的遍历大多数都需要移动指针,不同数组可以通过索引直接指向想要的地方,有时候我们移动指针修改完之后,我们想 return 结果时却发现指针指向链尾,若是单向链表我们就无法再回去,非常的蛋疼。虚拟头节点可以很好的解决这个问题(其实就是缓存头节点便于 return)

# 字符串的正则

正则可以很轻松的匹配到我们想要的字符串(就是用起来不轻松)甚至位置,当遇到字符串问题需要查找时,可以考虑使用正则

# 分治

第一次遇到超时问题时是懵逼的,明明思路对,却被问题时间限制了,分治是一种降低时间复杂度常用的方法,它主要针对排序数组的查找以及平方开方的数学问题,递归排序里的归并和快排也用到了分治的思想