leetcode之78子集Golang

题目描述

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

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

算法

我们定义一个bool切片,它的长度与参数数组的长度一样,bool切片中位置index的元素的值如果为true,那么说明参数数组位置index的元素在子集中,否在不在子集中

  • 首先判断如果入口参数数组的长度如果为0,那么就直接返回空值
  • 对于第一个位置,有truefalse两种状态
    • 第一个值为true,那么继续下一层,第二个位置又有truefalse两种状态
    • 第一个值为false,那么继续下一层,第二个位置又有truefalse两种状态
  • 当前是最后一层,也就是bool切片的最后一个元素为true或者false已经确定了
    • 根据bool切片各个位置为true或者为false去入口参数数组中获取对应位置的元素
    • 然后将这个结果存入到结果数组中

代码

func subsets(nums []int) [][]int {
	res := make([][]int, 0)
	if len(nums) == 0 {
		return res
	}
	// 用这个bool切片来表示数组中哪些元素在子集中,因为数组中每一个元素在子集中就两种状态
	// 如果为true就表示在子集中,如果为false,就表示不在子集中
	boolSlice := make([]bool, len(nums))
	var recursion func(bs []bool, index int)
	recursion = func(bs []bool, index int) {
		// 深度遍历到了最后
		if index == len(bs) {
			tmpRes := make([]int, 0)
			for i, v := range bs {
				// 根据在bool切片中为true或者false判断数组中对应元素是否在子集中
				if v {
					tmpRes = append(tmpRes, nums[i])
				}
			}
			res = append(res, tmpRes)
			return
		}
		bs[index] = true
		recursion(bs, index+1)
		bs[index] = false
		recursion(bs, index+1)
	}
	recursion(boolSlice, 0)
	return res
}
posted @ 2020-11-13 10:35  胖胖咩  阅读(221)  评论(0)    收藏  举报