leetcode hot100 78. 子集 递归回溯 medium 位运算法

题目 决策 递归结构
全排列 每层必须选一个 深度固定
子集 每个元素选/不选 深度递增

每个元素都有两种选择:选 或 不选。

python 复制代码
[]
├── [1]
│   ├── [1,2]
│   │   └── [1,2,3]
│   └── [1,3]
├── [2]
│   └── [2,3]
└── [3]

切片回溯

  • 排列:顺序重要 → 所有剩余都可选
  • 组合 / 子集:顺序不重要 → 只能往后选
问题类型 下一层还能选谁 代码
排列 除自己以外所有 nums[:i] + nums[i+1:]
子集 / 组合 只选后面的 nums[i+1:]
python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []

        def backtrack(nums, tmp):  #(待选列表,已有排列)
            res.append(tmp)   # 当前路径就是一个子集

            # 依次选择待选列表的元素,进入排列。
            for i in range(len(nums)):
                backtrack(nums[i+1:], tmp + [nums[i]])  # 子集顺序不重要,只能往后选

        backtrack(nums, [])
        return res

只能向后选:

python 复制代码
[]
├── [1]
│   ├── [1,2]
│   │   └── [1,2,3]
│   └── [1,3]
├── [2]
│   └── [2,3]
└── [3]

如果数组长度为 n,子集总数 = 2ⁿ

理论最优:O(n × 2ⁿ)

简单写法(位运算法)

每个元素可以选或不选,可以用二进制表示:

python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = [] 
        n = len(nums)

        # 数组长度为 n,子集总数 = 2ⁿ,则一共有2ⁿ种mask模板,2ⁿ=(1 << n)  (左移)
        for mask in range(1 << n):
            subset = []  # 这个mask产生的子集
            # 对每种mask,数组的n位
            for i in range(n):    # 对nums[0], nums[1], nums[2]...
                if mask & (1 << i):  # 判断该位是否为 1
                    subset.append(nums[i])  # 数字加入子集

            res.append(subset)  # 子集加入答案

        return res

时间复杂度

外层循环:2ⁿ

内层循环:n

方法 时间复杂度 额外空间
二进制位图 O(n·2ⁿ) O(n)
回溯 O(n·2ⁿ) O(n)
相关推荐
Frostnova丶1 小时前
LeetCode 761. 特殊的二进制字符串
算法·leetcode
再难也得平2 小时前
[LeetCode刷题]49.字母异位词分组(通俗易懂的java题解)
java·开发语言·leetcode
52Hz1182 小时前
力扣131.分割回文串、35.搜索插入位置、74.搜索二维矩阵、34.在排序数组中查找...
python·算法·leetcode
Tisfy3 小时前
LeetCode 761.特殊的二进制字符串:分治(左右括号对移动)
算法·leetcode·字符串·递归·分治
再难也得平3 小时前
[LeetCode刷题]1.两数之和(java题解)
java·算法·leetcode
踩坑记录3 小时前
leetcode hot100 39. 组合总和 medium 递归回溯
leetcode
再难也得平4 小时前
[LeetCode刷题]283.移动零(通俗易懂的java题解)
java·算法·leetcode
不想看见4044 小时前
House Robber 基本动态规划:一维--力扣101算法题解笔记
笔记·算法·leetcode·代理模式
追随者永远是胜利者4 小时前
(LeetCode-Hot100)647. 回文子串
java·算法·leetcode·职场和发展·go