【回溯算法i】golang-组合问题

本文探讨了回溯算法在解决组合问题中的应用,包括组合、组合III、组合(可重复选取)和组合II。文章详细阐述了回溯算法的本质,即减少多层for循环,转而通过递归遍历N叉树的方式来解决问题。同时,提供了回溯算法模板,并针对不同情况,如元素是否可重复选取,提出了不同的处理策略。
摘要由CSDN通过智能技术生成

回溯算法

  • 回溯算法主要解决的问题
    1. 按一定规律组合问题
    2. 按一定规律的排列问题
    3. 按一定规律分割,如分割为回文字符串、IP地址还原(注意path中存放符合要求的切割子集)等
    4. N皇后问题
    5. 数独问题
  • 回溯算法的本质
    回溯算法主要是为了解决for嵌套,当暴力解法需要多层for嵌套时,如50层for循环,此时需要使用回溯解决;
    回溯的对象可以归类为N叉树,一层for循环遍历宽度,之后递归遍历深度
  • 回溯算法模板
    func xxx (参数) {
    	if (终止条件) {
    		xxx
    		return
    	}
    	for 遍历宽度 {
    		xx
    		func_name(参数)   // 递归
    		xxx   // 回溯
    	}
    }
    

组合问题

  • tip: 需要用到startIndex,当集合中元素不可重复时,递归传参index+1,参考用例:组合III;当其可重复时,递归传参为index,参考用例:组合,可重复选取
  • 当数组中存在重复元素,但是每个元素只能使用一次时,需要在树层间去重,树枝可以存在重复元素,参考用例:组合II

组合III

	func CombinationI(n, k int) [][]int {
		var res [][]int
		var path []i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值