78.子集
2018-10-30 本文已影响0人
jianshujoker
代码解答
func subsets(nums []int) [][]int {
var res [][]int
var temp []int
//开始回溯 用指针是因为golang slice和其他语言数组有些不一样,增加长度时会指向新的地址
dfs(&res,temp,nums,0)
return res
}
//深度优先
func dfs(res *[][]int,temp []int,nums []int,j int){
tp:=make([]int,len(temp),len(temp))
//复制临时数组记录遍历节点,避免数据混乱
copy(tp,temp)
*res=append(*res,tp)
for i:=j;i<len(nums);i++{
//遍历到当前节点
temp=append(temp,nums[i])
dfs(res,temp,nums,i+1)
//回到当前节点的上一节点
temp=temp[:len(temp)-1]
}
}
思路解析
读题分析应该用递归,第一个数与剩余数组合,第二个数与排除第一个数后剩余数组合...到达边界后返回上一节点继续遍历
以输入nums = [1,2,3]为例转换为的树
以输入nums = [1,2,3]为例遍历到的顺序
&[[]]
&[[] [1]]
&[[] [1] [1 2]]
&[[] [1] [1 2] [1 2 3]]
&[[] [1] [1 2] [1 2 3] [1 3]]
&[[] [1] [1 2] [1 2 3] [1 3] [2]]
&[[] [1] [1 2] [1 2 3] [1 3] [2] [2 3]]
&[[] [1] [1 2] [1 2 3] [1 3] [2] [2 3] [3]]