leetcode之78子集Golang
阿新 • • 發佈:2020-11-13
題目描述
給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: nums = [1,2,3]
輸出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
演算法
我們定義一個bool
切片,它的長度與引數陣列的長度一樣,bool
切片中位置index
的元素的值如果為true
,那麼說明引數陣列位置index
的元素在子集中,否在不在子集中
- 首先判斷如果入口引數陣列的長度如果為0,那麼就直接返回空值
- 對於第一個位置,有
true
和false
兩種狀態- 第一個值為
true
true
和false
兩種狀態 - 第一個值為
false
,那麼繼續下一層,第二個位置又有true
和false
兩種狀態
- 第一個值為
- 當前是最後一層,也就是
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 }