回溯算法及其剪枝优化修改----学习笔记

博客介绍回溯算法,它是纯暴力搜索,可用于组合、切割、子集、排列、棋盘等问题。以LeetCode 77.组合题为例,讲解了k重for循环和回溯算法两种解法,回溯算法思路可看成二叉树,还提及确定递归函数参数返回值、终止条件和单层递归逻辑等代码思路及剪枝优化。

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

视频来源:代码随想录

https://www.bilibili.com/video/BV1cy4y167mM

 

(递归函数)/(回溯函数):回溯就是递归的过程

回溯搜索法:是纯暴力搜索

例如:

  1. 组合问题:求字符串1234中的所有大小为2的组合
  2. 切割问题:求字符串特定切割(成回文子串)方法数量
  3. 子集问题:求字符串1234中所有的子集
  4. 排列问题:求字符串1234有顺序的排列
  5. 棋盘问题:N皇后、解数独等问题

 

思路:

一般都能看成N叉树

 

伪代码思路:

Void backtracking(){
	If (终止条件){
		搜集结果;
		return;
	}
	For(集合元素集){
		处理结点;
		递归函数;
		回溯操作;
	}
	return;
}

 

样题:

Leecode 77.组合

题目:给定字符串,求个数为k的所有组合

方法1:k重for循环

方法2:回溯算法

思路:使用二叉树。

取1,剩下234, 取2,得12;

取3,得13;

取4,得14;

取2,剩下34,   取3,得23;

取4,得24;

取3,剩下4,     取4,得34。

 

代码思路:

  1. 确定递归函数参数返回值
  2. 确定终止条件
  3. 单层递归逻辑

 

伪代码:

 

# 一维数组patch
# 二维数组result
# n维数组: 1234
# 组合长度k: 2
Void backtracking(n,k,startindex){
	If (patch.size==k){
		Return ;
	}
	For (I = startindex;i<=n;i++){
		Patch.push(i)
		backtracking(n,k,i+1)
		Patch.pop()
	}
}

 

回溯算法的剪枝:

当n=4,k=4时,题目二叉树变为了

 

 

单层搜索逻辑剪枝优化:

# 一维数组patch
# 二维数组result
# n维数组: 1234
# 组合长度k:4
Void backtracking(n,k,startindex){
	If (patch.size==k){
		Return ;
	}
	# n-(k-patch.size)+1 代表最多(即最极限)可以从数组哪个位置开始
	# n=4,k=3,得到值为2,即数组的第2个元素,但是这个地方注意由于push/pop的直接是i,不是i作为索引的数组值,所以使用+1且在for判断时使用<=,而不是<
	For (I = startindex;i<=n-(k-patch.size)+1;i++){
		Patch.push(i)
		backtracking(n,k,i+1)
		Patch.pop()
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值