leetcode 78. 子集

leetcode 78. 子集

給定一組不含重複元素的整數數組 nums,返回該數組全部可能的子集(冪集)。 說明:解集不能包含重複的子集。 示例:程序員

輸入: nums = [1,2,3]
輸出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
複製代碼

分享這道題的緣由是他能夠遞歸又能夠循環~ 非是小弟不堪言,實乃代碼纔是天~算法

遞歸
func subsets(nums []int) [][]int {
    re := [][]int{}
    //go的閉包很好玩,能夠不用傳不少變量了~
    var dfs func(j int, r []int) dfs = func(j int, r []int) {
    	//這裏是須要把切片複製一份,否則可能會被後序操做影響到
        tmp := append([]int{},r...)
        re = append(re,tmp)
        //回溯的標準寫法哈哈,感受像套公式同樣,可是確實比較好理解
        for i := j; i<len(nums); i++ {
            dfs(i+1,append(r,nums[i]))
        }
    }
    dfs(0,[]int{})
    return re
}
複製代碼
循環

這個方法是借鑑了別人分享的~感受思路很清晰。數組

func subsets(nums []int) [][]int {
    res := make([][]int, 0)
    res = append(res, []int{})
    for i := len(nums)-1; i >= 0; i-- {
        length := len(res)
        for j := 0; j < length; j++ {
            tmp := make([]int, 0)
            tmp = append(tmp, nums[i])
            //這裏的...的意思是把切片中的全部元素一個個地添加到tmp中
            tmp = append(tmp, res[j]...)
            res = append(res, tmp)
        }
    }
    return res
}
複製代碼

好了,今天的題目雖然比較簡單,可是咱們能夠發現其中蘊含着的智慧。再次呼籲你們一塊兒來作作算法題,不必定是程序員哦,各行各業均可以來玩玩,真的很鍛鍊思惟的。bash

算法夢想家,來跟我一塊兒玩算法,玩音樂,聊聊文學創做,我們一塊兒天馬行空!閉包

相關文章
相關標籤/搜索