LeetCode 刷题笔记 - 78. 子集

276 阅读1分钟

难度:

中等

描述:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例:

示例 1:

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

示例 2:

输入:nums = [0]
输出:[[],[0]]

来源:力扣(LeetCode)链接:leetcode-cn.com/problems/su… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


语言:

swift

解析:

集合中每个元素的选和不选,构成了一个满二叉状态树,比如,左子树是不选,右子树是选,从根节点、到叶子节点的所有路径,构成了所有子集。可以有前序、中序、后序的不同写法,结果的顺序不一样。本质上,其实是比较完整的中序遍历。

代码如下:

class Solution {
    func subsets(_ nums: [Int]) -> [[Int]] {
        var result: [[Int]] = []
        result.append([])
        guard nums.count > 0 else { return result }
        let path: [Int] = []
        backtrack(nums: nums, index: 0, path: path, result: &result)
        return result
    }

    private func backtrack(nums: [Int], index: Int, path: [Int], result: inout [[Int]]) {
        guard index < nums.count else { return }
        var path: [Int] = path
        backtrack(nums: nums, index: index + 1, path: path, result: &result)
        path.append(nums[index])
        backtrack(nums: nums, index: index + 1, path: path, result: &result)
        result.append(path)
    }
}

总结

把该题抽象成二叉树就简单很多了。