算法框架小结

一. 动态规划

思路:

  1. 明确 状态:找出原问题和子问题中变化的值是哪个
  2. 定义 dp 数组 / 函数 的含义:明确 dp 数组最后要求的值
  3. 明确 选择并择优:明确前后状态的变化
  4. 明确基本状态:就是要初始化的数组值

例子:凑零钱问题

  1. 最少的硬币数
  2. 价格 n 时的硬币数
  3. 在之前相隔硬币价值的 dp 元素中取最小值 加一
  4. 刚好求到价格 n 为 0 时返回 0,n 小于 0 时返回 -1 , 并一直返回 -1

二. 回溯算法

思路:

  1. 路径:已经做出的选择
  2. 选择列表:可以做出的选择
  3. 结束条件:到达决策树底层,无法再选择的条件

例子:N 皇后问题
4. 已经放置的皇后,及皇后所在的横竖斜都被占领
5. 选择这行的那个列放皇后
6. 行数到达底部

tips:递归时增加行数,每次递归判断每一列是否能放置,递归完后回溯
判断时判断同列,两斜线是否有皇后

三. BFS算法

思路:
找出所有的下一步可能性
找到结束条件
将经历过的情况记录下来,再遇到就略过
使用队列,层序遍历,直到找到答案

例子:二叉树的最小高度
下一步可能性为遍历 left 或 right 节点
结束条件为 左右子节点都为 null
记录层数,找到叶子节点后退出

tips:
双向 BFS:知道终点的情况下,也从终点一起开始遍历,每次查找数量最小的下一步所有情况

四. 二分查找

思路:
闭区间查找,即 [ left , right ] 而非 [ left ,right)
结束条件:区间为空 ,左指针大于右指针
根据具体条件(要缩减左边界还是右边界)
判断指针时 mid + 1 还是 - 1
判断返回左指针还是右指针

以上思路来自高星 github 项目
是一个成都老哥写的,可以关注他的公众号 labuladong ,有 PDF 版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值