组合
给定两个数n、k,在1~n之内可以组成多少个大小为k且互不不同的数组。
读完题目发现这是一道回溯题。做回溯题的时候心中要自然的建立一棵树(虽然代码中并不需要通过建树解决问题)。假如n为3,k为2,让我们来看看这棵树长什么样:
但是回溯其实是暴力的做法,如果可以的话要尽可能的剪枝,减少不必要的路径。
例如:如果当前的数组加上后面剩余可以选择区间小于k,那么可以直接返回了,因为后面根本不存在大小为k的数组。
像这样:
上代码:
var ans [][]int
func dfs(arr []int, n, k, index int){
//剪枝
if len( arr ) + n - index + 1 < k{
return
}
if len( arr ) == k{
temp := make([]int, k)
copy(temp, arr)
ans = append(ans, temp)
return
}
for i:= index; i<=n;i++{
arr = append( arr, i)
dfs(arr, n, k, i+1)
arr = arr[:len(arr)-1]
}
}
func combine(n int, k int) [][]int{
arr := []int{}
ans = [][]int{}
dfs(arr, n, k, 1)
return ans
}