高频刷题-回溯法(backtracking)专题

本文探讨了回溯法(backtracking)的本质,将其与暴力求解法进行对比,强调了在遇到约束条件不满足时,回溯法如何通过退回并尝试其他路径来寻找解决方案。适合采用回溯法的问题类型包括返回所有答案的集合,而非追求最优解。文中还提供了一个通用的回溯法解题模板,并通过LeetCode上的几个题目(如排列、子集问题)进行了实践应用,解释了如何处理重复元素和避免结果集的重复。
摘要由CSDN通过智能技术生成

首先,什么是backTracking?

这是backtracking和brute force的区别:

Backtracking can be seen as an optimized way to brute force. Brute force approaches evaluate every possibility. In backtracking you stop evaluating a possibility as soon it breaks some constraint provided in the problem, take a step back and keep trying other possible cases, see if those lead to a valid solution.

翻译过来就是:backtracking可以被看作是一个优化的蛮力。蛮力方法的做法是暴力遍历每一种的可能性。但是backtracking中如果遇到不满足约束条件的时候,就停止这一次的遍历,然后退一步,继续尝试其他可能的情况下的解。

哪些问题适合采用backtracking方法求解?

  1. 显式的要求返回所有答案的集合(Permutations or subsets)。   
  2. 你关心的是实际的解的集合,而不是求解最优值(例如最大值,最小值等)。(如果是后者最有可能适合采用DP方法)。

下面是一个backtracking求解的通用模板:

实际上backtracking就是DFS方法,上图的undo choices 可以理解为往上跳一级。

下面我们来求解46和47,Permutations

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值