枚举所有子集
例如一个数组为:[]int{1, 2, 3},每个元素存在取或不取两种情况,那么所有子集情况共有 23 = 8 种。可以总结:子集的总个数为 2n, n = 数组长度。
由于这种特性,可以通过二进制位运算来实现遍历所有子集
比如遍历二进制 000 到 111,相应位为 1 时,则取对应数组索引位的元素,所有的情况如下:
000
001
010
011
100
101
110
111
参考代码:
func allSubset(nums []int) {
for i := 0; i < 1<<len(nums); i++ {
arr := make([]int, 0)
for j, num := range nums {
if i>>j&1 == 1 {
arr = append(arr, num)
}
}
fmt.Printf("%+v\n", arr)
}
}
测试代码:
func Test_allSubset(t *testing.T) {
type args struct {
nums []int
}
tests := []struct {
name string
args args
}{
{
args: args{nums: []int{1, 2, 3}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
allSubset(tt.args.nums)
})
}
}
运行结果:
[]
[1]
[2]
[1 2]
[3]
[1 3]
[2 3]
[1 2 3]
相关题目
回溯法相关的题目会用到