时间复杂度(优先)
算法的执行时间与输入值之间的关系,与循环有关。
常见的时间复杂度:o(1)、o(logn)(二分查找法)、o(n)、o(nlogn)(排序)、o(n^2)、o(2^n)、o(n!)
空间复杂度
算法的存储空间与输入值之间的关系
常见的空间复杂度:o(1)、o(n)、o(n^2)

双指针

普通双指针:两个指针可能朝同一方向移动
对撞双指针:两个指针面对面移动,一组数有序时,可以采用对撞
快慢双指针:慢指针+快指针,检测是否为环形链表,可采用快慢指针

二分查找法

重要特点:一定要有序,然后从中间开始不断二分
时间复杂度:o(logn)

二分查找框架

image.png

滑动窗口

如果需要求数组的定长,可以采用滑动窗口的思想,转化k个数的和为窗口值加一个数再减一个数

递归

函数直接或间接调用自己
满足四要素:接受的参数、返回值、终止条件、递归拆解(如果递归下一层)
时间复杂度:o(2^n)
空间复杂度:o(n) 递归栈

分治法

把大问题切割成一个个小问题,解决小问题后合成大问题的解,是一种特殊的递归

回溯法

类似枚举,一层一层向下递归,尝试搜索答案,找到所有的可能
找到答案->尝试别的可能/返回答案
找不到答案->返回上一层递归,尝试别的路径
回溯=DFS+剪枝

深度优先搜索DFS

从根节点开始,尽可能深的搜索每一个分支(把一个分支的结果搜索完了之后,再搜索下一个分支),侧重点是分支
主要应用:二叉树搜索、图搜索
二叉树DFS遍历结构:
image.png
网格DFS遍历结构:
image.png
如何避免网格的重复遍历:标记已经遍历过的格子
image.png

广度优先搜索BFS

与BFS类似,侧重点是层,可以用队列进行辅助
从上到下,从左到右,依次输出节点
BFS使用队列的数据结构:
image.png