【专题:回溯】子集系列

92 阅读1分钟

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例1

输入: nums = [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例2

输入: nums = [0]
输出: [[],[0]]

解法

func subsets(nums []int) [][]int {
    res:=[][]int{}
    dfs78(nums,0,nil,&res)
    return res
}

func dfs78(nums []int,index int, temp []int, res *[][]int){
    copyTemp:=make([]int,len(temp))
    copy(copyTemp,temp)
    *res=append(*res,copyTemp)
    for i:=index;i<len(nums);i++{
        dfs78(nums,i+1,append(temp,nums[i]),res)
    }
    return
}

解题思路

78.jpg

90.子集II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例1

输入: nums = [1,2,2]
输出: [[],[1],[1,2],[1,2,2],[2],[2,2]]

示例2

输入: nums = [0]
输出: [[],[0]]

解法

func subsetsWithDup(nums []int) [][]int {
    res:=[][]int{}
    sort.Ints(nums)
    dfs90(nums,0,nil,&res)
    return res
}

func dfs90(nums []int,index int,temp []int, res *[][]int){
    copyTemp:=make([]int,len(temp))
    copy(copyTemp,temp)
    *res=append(*res,copyTemp)
    for i:=index;i<len(nums);i++{
        if i>index&&nums[i]==nums[i-1]{
            continue
        }
        dfs90(nums,i+1,append(temp,nums[i]),res)
    }
    return
}

解题思路

90.jpg