给出一组候选数 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)
}
}
}