难度:
中等
描述:
给你一个整数数组
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)
}
}
总结
把该题抽象成二叉树就简单很多了。