216. 组合总和 III
题目描述:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
考察重点:递归回溯
方法概括:注意回溯中,go指针和go数组的使用方式。
func recursion1(nums []int, res *[][]int, numslen int, nowN int, k int, n int) bool { //当前递归数组,结果数组,当前递归数组长度,当前递归数组和,目标长度,目标和if numslen == k && nowN == n { //如果长度,和 都满足条件,则加入结果数组resval := *resvar t []int = make([]int, numslen) //注意,nums是指针,不能直接赋给res,必须复制数组元素到新数组copy(t, nums)addr := append(val, t)*res = addr //结果数组res是指针return true}if numslen >= k { //如果长度已经超出但是仍不满足条件,停止递归return false}for i := nums[numslen-1] + 1; i <= 9; i++ { //依次遍历当前最大值到9nums[numslen] = i //加入新元素并且长度+1numslen++recursion1(nums, res, numslen, nowN+i, k, n)numslen--}return true
}func CombinationSum3(k int, n int) [][]int {var res [][]intfor i := 1; i < 10; i++ {var nums []int = make([]int, k)nums[0] = irecursion1(nums, &res, 1, i, k, n)}return res
}