LC 78回溯中等第 58 / 95 题

子集

Subsets

回溯子集树
本机进度仅保存在当前浏览器

题目描述

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

示例:nums = [1, 2, 3],输出 [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]。

解题思路

  1. 每个元素都有"选 / 不选"两种状态,全部 n 个元素的决定构成一棵深度为 n 的子集树,回溯就是这棵树的深度优先枚举。
  2. 常用实现:路径 path 记录已选元素,每次递归先把当前 path 存入结果,再从下一个下标开始继续选择。
  3. "从 start 开始"保证组合内部元素有序,天然去重;元素互不相同使问题无需剪枝。

参考实现

查看参考实现Python · 建议先自行作答
def subsets(nums):
    res, path = [], []

    def backtrack(start):
        # 当前路径本身就是一个子集
        res.append(path[:])
        for i in range(start, len(nums)):
            path.append(nums[i])
            backtrack(i + 1)
            path.pop()

    backtrack(0)
    return res

复杂度与归属

时间复杂度O(n · 2^n)
空间复杂度O(n)
所属分类回溯
题源LeetCode 78

关联教程

返回题图鉴