Introduction
二叉树
- 如果是需要递归的算法,要先考虑清楚返回值是什么,意义是啥,然后在递归的尽头如何处理特殊值,要保证参数的一致性。
- 二分查找的while里面是情况有两种(记住这个口诀,可以方便写出判断逻辑):
- 可以保证需要查找的数据在[start, end]里的
- 需要查询的数据如果存在,那肯定在这个[start, end]里面,或者肯定不在这个[start, end]里面
- 动态规划可以通过变化函数的意义来改变从头遍历还是从尾遍历
- 先画出最后满足条件的状态
- 再思考f(n),也就是有和没有最后一个元素的区别联系
- state存储的就是函数值
- 再确定函数意义,要多思考函数的意义,result可能是state[n - 1], max(...state), min(...state)
- 如果原函数有两个参数,动态规划的函数参数可能是其中任意一个,也可能是两个参数的组合
- 二维的f(n),要思考在各种情况下如何满足最后的条件
- 在分析f(n)的过程中,如果出现了两个变量,则用二维动态规划参数组合
- 参数为两个字符串,并且寻找的东西是连续的,则考虑使用滑动窗口
- 排列、组合、子串、分割,考虑使用回溯法
- 二进制运算时要多加(),例如
(num & diff) === diff
和num & diff === diff
的值就不一样
- 需要掌握二叉树、完全二叉树的性质
- 最短距离算法,常用解题方法是BFS、 回溯法、动态规划、Dijkstra
- 如果是矩阵最短路径,且只可以向两个方向移动,用动态规划
- 如果是矩阵最短路径,且每一步等距(即先遍历到的点就是最短路径),就使用BFS
- 如果是矩阵最短路径,但是每一步距离不固定,就使用回溯法或者dijkstra
- 解决问题的难度排序是(小→大):动态规划、BFS、回溯法、Dijkstra
- 掌握数组,字符串的所有操作
- 掌握Math的所有操作
- 二叉搜索树的中序遍历是升序的
- 单调栈需要思考的问题(例如https://leetcode.cn/problems/trapping-rain-water/):
- 栈里面存放的是未知的,暂时无法处理的,对后面有影响的。(正常栈里面存放的元素是递增或递减的)
- 要明确每次处理的是什么,就是要把已经确定的东西给算出来