给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
- 1 <= nums.length <= 10
- -10 <= nums[i] <= 10
解题:
func subsetsWithDup(nums []int) [][]int {
sort.Ints(nums)
var r [][]int
tmp := make([]int, 0)
r = append(r, tmp)
l := len(nums)
var df func(i int)
df = func(i int) {
if i >= l {
return
}
tmp = append(tmp, nums[i])
a := make([]int, len(tmp))
copy(a, tmp)
r = append(r, a)
df(i + 1)
tmp = tmp[:len(tmp)-1]
i++
for i < l && nums[i-1] == nums[i] {
i++
}
df(i)
}
df(0)
return r
}
官方解答:
1.迭代法实现子集枚举
func subsetsWithDup(nums []int) (ans [][]int) {
sort.Ints(nums)
n := len(nums)
outer:
for mask := 0; mask < 1<<n; mask++ {
var t []int
for i, v := range nums {
if mask>>i&1 > 0 {
if i > 0 && mask>>(i-1)&1 == 0 && v == nums[i-1] {
continue outer
}
t = append(t, v)
}
}
//ans = append(ans, append([]int(nil), t...))
ans = append(ans, t)
}
return
}
2.递归法实现子集枚举
func subsetsWithDup(nums []int) (ans [][]int) {
sort.Ints(nums)
var t []int
var dfs func(bool, int)
dfs = func(choosePre bool, cur int) {
if cur == len(nums) {
ans = append(ans, append([]int(nil), t...))
return
}
dfs(false, cur+1)
if !choosePre && cur > 0 && nums[cur-1] == nums[cur] {
return
}
t = append(t, nums[cur])
dfs(true, cur+1)
t = t[:len(t)-1]
}
dfs(false, 0)
return
}