一. 动态规划
思路:
- 明确 状态:找出原问题和子问题中变化的值是哪个
- 定义 dp 数组 / 函数 的含义:明确 dp 数组最后要求的值
- 明确 选择并择优:明确前后状态的变化
- 明确基本状态:就是要初始化的数组值
例子:凑零钱问题
- 最少的硬币数
- 价格 n 时的硬币数
- 在之前相隔硬币价值的 dp 元素中取最小值 加一
- 刚好求到价格 n 为 0 时返回 0,n 小于 0 时返回 -1 , 并一直返回 -1
二. 回溯算法
思路:
- 路径:已经做出的选择
- 选择列表:可以做出的选择
- 结束条件:到达决策树底层,无法再选择的条件
例子:N 皇后问题
4. 已经放置的皇后,及皇后所在的横竖斜都被占领
5. 选择这行的那个列放皇后
6. 行数到达底部
tips:递归时增加行数,每次递归判断每一列是否能放置,递归完后回溯
判断时判断同列,两斜线是否有皇后
三. BFS算法
思路:
找出所有的下一步可能性
找到结束条件
将经历过的情况记录下来,再遇到就略过
使用队列,层序遍历,直到找到答案
例子:二叉树的最小高度
下一步可能性为遍历 left 或 right 节点
结束条件为 左右子节点都为 null
记录层数,找到叶子节点后退出
tips:
双向 BFS:知道终点的情况下,也从终点一起开始遍历,每次查找数量最小的下一步所有情况
四. 二分查找
思路:
闭区间查找,即 [ left , right ] 而非 [ left ,right)
结束条件:区间为空 ,左指针大于右指针
根据具体条件(要缩减左边界还是右边界)
判断指针时 mid + 1 还是 - 1
判断返回左指针还是右指针