1. 程式人生 > 實用技巧 >leetcode之78子集Golang

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
}