回溯算法的刷题小结

这篇博客总结了回溯算法在解决组合、切割、排列和子集问题上的应用。在组合问题中,博主探讨了单个和多个集合的情况,并提到了如何处理重复元素。切割问题关注的是如何表示切割区间。排列问题强调了顺序的重要性,以及如何处理已使用的元素。子集问题在回溯过程中收集所有节点的结果。最后,博客还涉及了棋盘问题,如N皇后和解数独,讨论了它们的递归模板和解题策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合问题

切割问题

  切割问题与组合问题的区别在于:组合问题是对集合的元素进行选取,而切割问题是对集合的区间进行划分。因此如何表示切割的区间是切割问题的很重要的一步。
  例如在力扣131:分割回文串中,for循环中startIndex和i为切割区间。

排列问题

  排列问题不同于组合问题,需要考虑不同元素间的顺序问题,因此每次遍历需要从0开始;但是与多个集合的组合问题不同,排列问题不能理解为单个集合的多次组合,因为其元素间存在互斥关系,已经使用过的元素不能在下次递归中出现,因此应当对使用过的元素进行标记。
  排列问题的去重(力扣47:全排列II)相较于组合会有些复杂,可以使用代码随想录的方法,也可以将集合排序后每次移动到最后一个为使用元素。

子集问题

  子集问题是在树搜索过程中的所有结点都收集结果,而其他问题只是在叶子结点收集结果。

棋盘问题

  • 力扣51:N皇后
    清楚如何判断放置位置是否合法后很容易得到题解题解。
  • 力扣37:解数独
    不同于N皇后问题,该题需要对二维期盼进行遍历,因此递归模板会有所区别。
    同时解数独问题没有对结果进行收集,而引用变量在回溯完成后最终回到初始状态,因此需要在找到结果之后终止回溯过程。可以将迭代函数设置为boolean类型,判断迭代函数是否为真来确定是否终止迭代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值