天天看点

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

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

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

注意:

1. 题目中所有的数字(包括目标数 T )都是正整数

2. 组合中的数字 ( a1,a2,...,ak ) 要按非递减排序 ( 

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

 ).

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)
		}
	}
}