Go 算法:枚举所有子集

501 阅读1分钟

枚举所有子集

例如一个数组为:[]int{1, 2, 3},每个元素存在取或不取两种情况,那么所有子集情况共有 23 = 8 种。可以总结:子集的总个数为 2n, n = 数组长度。

由于这种特性,可以通过二进制位运算来实现遍历所有子集

比如遍历二进制 000111,相应位为 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]

相关题目

回溯法相关的题目会用到