代码随想录算法训练营第30天|回溯总结

回溯

  • 递归:走到下一层
  • for循环:走到本层的不同分支
  • for循环横向遍历,递归纵向遍历,回溯不断调整结果集

1. 组合问题

  • 控制startIndex变化
  • 单个集合取元素,结果集不存在重复元素:startIndex=i+1(下层递归从下一个元素开始)
  • 单个集合取元素,结果集存在重复元素:startIndex=i
  • 多个集合取元素,结果集不存在重复元素:index+1(控制取不同集合),集合内控制取不同元素
  • 去重问题:树层去重(used数组或startIndex)
  • 剪枝优化,加限制条件

2. 切割问题

  • 关键点:切割线startIndex的移动
  • 终止条件
  • 如何截取子串

3. 子集问题

  • 子集问题是要收集所有节点的结果

4. 排列问题

  • 每层都是从0开始搜索而不是startIndex
  • used数组记录已取元素

性能问题

子集问题分析:

  • 时间复杂度:O(2n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2n)
  • 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n)

排列问题分析:

  • 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * … 1 = n!。
  • 空间复杂度:O(n),和子集问题同理。

组合问题分析:

  • 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。
  • 空间复杂度:O(n),和子集问题同理。

一般回溯算法的复杂度,都是指数级别的时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值