《leetcode-go》加起来和为目标值的组合

该博客探讨了一个利用递归算法解决寻找数组中所有组合之和等于目标数的问题。代码实现中,首先对输入数组进行排序,然后通过递归方式遍历数组,避免重复组合,并确保组合元素按非递减顺序排列。递归过程中,对于每个数字,创建新的临时数组并继续寻找剩余部分的组合。最后返回所有满足条件的组合。这个算法适用于解决正整数的组合求和问题,数据范围在给定限制内。
摘要由CSDN通过智能技术生成

给出一组候选数 C 和一个目标数 T ,找出候选数中起来和等于 T 的所有组合。

C 中的每个数字在一个组合中只能使用一次。

注意:

1. 题目中所有的数字(包括目标数 T )都是正整数
2. 组合中的数字 ( a1,a2,...,ak ) 要按非递减排序 (  ).
3. 结果中不能包含重复的组合
4. 组合之间的排序按照索引从小到大依次比较,小的排在前面,如果索引相同的情况下数值相同,则比较下一个索引。

数据范围:

1<=n<=50

1<=target<=100

1<=C[i]<=50

思路:递归的方法,固定一个值,然后在这个值之后的里面找可以的组合,重点需要注意的是递归怎么把数据传出来,还有临时的tmp一定要是新定义的,要不然slice是共用的

package main
import "sort"
/**
 * 
 * @param num int整型一维数组 
 * @param target int整型 
 * @return int整型二维数组
*/
func combinationSum2(num []int, target int) [][]int {
	// write code here
	sort.Ints(num)
	res := make([][]int, 0)
	combination(num, 0, target, nil, &res)
	return res
}

func combination(num []int, start int, target int, tmp []int, res *[][]int) {
	if target <= 0 {
		if target == 0 {
			*res = append(*res, tmp)
		}
		return
	}
	for i := start; i < len(num); i++ {
		if num[i] <= target {
			if i > start && num[i] == num[i-1] {
				continue
			}
			newTmp := append([]int{}, tmp...)
			newTmp = append(newTmp, num[i])
			combination(num, i+1, target-num[i], newTmp, res)
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值