回溯算法套路整理

刷了好久的leetcode,也快刷满300道了,开始复习整理一下做题的套路。
就从回溯算法开始吧。

一、什么是回溯

回溯法(back tracking)(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

二、回溯的模板

解决一个回溯问题,实际上就是一个决策树的遍历过程。在解决这些问题的时候,需要考虑三个问题:

  • 路径:也就是已经做出的选择。
  • 选择列表:也就是你当前可以做的选择。
  • 返回条件:也就是到达决策树底层,无法再做选择的条件。

正是如此,回溯算法才有一个类似的套路,可以把类似的题目,用一个套路来解决

const solution = () => {
	const res = [];  // 存放结果的数组
	// 回溯方法
	const backTrack = (...args,current) => {
		// 如果满足条件
		if(condition) {
			// do something;
			res.push(current)
			return;
		}
		// 根据条件循环递归
		for(;;;) {
			// 处理参数,然后递归
			current.push('操作');
			backTrack(...args,current);
			current.pop();
		}
	}
	backTrack(...initArgs);
	return res;
}

三、需要思考的问题

上面的代码,算是一个解决回溯算法的模板,在写出这个模板之后,就需要考虑设计这个模板了:

  • 声明需要的全局变量: 用来保存结果
  • 设计递归函数的参数: 递归函数的参数,是将上一次操作的合法状态当作下一次操作的初始位置。这里的参数,一般有两种:状态变量和条件变量。(1)状态变量(state)就是最后结果(result)要保存的值;(2)条件变量就是决定搜索是否完毕或者合法的值。
  • 返回条件: 完成条件是决定 状态变量和条件变量 在取什么值时可以判定整个搜索流程结束。搜索流程结束有两种含义: 搜索成功并保存结果 和 搜索失败并返回上一次状态。
  • 递归过程: 传递当前状态给下一次递归进行搜索。

四、可以解决的问题类型

  1. 排列、组合(子集、幂集、字符全排列)。 在传值时,对于排列问题,是要删掉单个用过的元素;组合问题,是删掉前面所有的元素。

  2. 数组、字符串,给定一个特定的规则,尝试搜索迭代找到某个解。

  3. 二维数组下的DFS搜索(八皇后、黄金矿工、数独)

五、性能优化方法

  • 剪枝:把不能匹配的条件先提前完成
  • 把传递数组改成下标等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值