func subsets(nums []int) (ans [][]int) {
n := len(nums)
for p := 0; p < 1<<n; p++ {
var a []int
for i, num := range nums {
if p>>i&1 > 0 {
a = append(a, num)
}
}
ans = append(ans, a)
}
return
}
Approach #1
func subsets(nums []int) (ans [][]int) {
n := len(nums)
var tmp []int
var dfs func(int)
dfs = func(cur int) {
if cur == n {
ans = append(ans, append([]int(nil), tmp...))
return
}
tmp = append(tmp, nums[cur])
dfs(cur + 1)
tmp = tmp[:len(tmp)-1]
dfs(cur + 1)
}
dfs(0)
return
}
func subsetsWithDup(nums []int) (ans [][]int) {
sort.Ints(nums)
n := len(nums)
outer:
for p := 0; p < 1<<n; p++ {
var a []int
for i, num := range nums {
if p>>i&1 > 0 {
if i > 0 && p>>(i-1)&1 == 0 && nums[i-1] == num {
continue outer
}
a = append(a, num)
}
}
ans = append(ans, append([]int(nil), a...))
}
return
}
Approach #1
func subsetsWithDup(nums []int) (ans [][]int) {
sort.Ints(nums)
n := len(nums)
var tmp []int
var dfs func(bool, int)
dfs = func(choosePre bool, cur int) {
if cur == n {
ans = append(ans, append([]int(nil), tmp...))
return
}
dfs(false, cur+1)
if !choosePre && cur > 0 && nums[cur-1] == nums[cur] {
return
}
tmp = append(tmp, nums[cur])
dfs(true, cur+1)
tmp = tmp[:len(tmp)-1]
}
dfs(false, 0)
return
}