回溯总结一:组合问题&切割问题

39. 组合总和、40. 组合总和 II_清榎的博客-CSDN博客

77. 组合、216. 组合总和 III、17. 电话号码的字母组合_清榎的博客-CSDN博客

这几道组合问题中需要注意几个点

数量要求,能否无限重复,有无总和的限制

思路其实都很相似,回溯,抽象为一棵树。

startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?

如果是一个集合来求组合的话,就需要startIndex,例如:39.组合总和、77.组合。

如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17.电话号码的字母组合

在求和问题中,排序之后加剪枝是常见的套路!

 40. 组合总和 II

这个题中的去重办法十分值得思考,如何进行的同层去重

当然去重时还可以采用一个used数组进行标记:

“树枝去重”和“树层去重”

都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。

40.组合总和II1

在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下:

  • used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
  • used[i - 1] == false,说明同一树层candidates[i - 1]使用过

 131. 分割回文串、93. 复原 IP 地址(切割问题)_清榎的博客-CSDN博客

切割问题主要有如下几个难点:

  • 切割问题其实类似组合问题
  • 如何模拟那些切割线
  • 切割问题中递归如何终止
  • 在递归循环中如何截取子串
  • 如何判断回文
  • 如何判断子串是否合法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值