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]为例转换为的树

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]]

上一篇 下一篇

猜你喜欢

热点阅读