78.子集

代码解答


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

思路解析

读题分析应该用递归,第一个数与剩余数组合,第二个数与排除第一个数后剩余数组合...到达边界后返回上一节点继续遍历

以输入nums = [1,2,3]为例转换为的树

78.子集_第1张图片
image

以输入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]]

你可能感兴趣的:(78.子集)