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)
相关推荐
逆境不可逃4 小时前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
Eward-an6 小时前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode
一叶落4386 小时前
LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)
c语言·算法·leetcode
x_xbx7 小时前
LeetCode:26. 删除有序数组中的重复项
数据结构·算法·leetcode
j_xxx404_9 小时前
力扣困难算法精解:串联所有单词的子串与最小覆盖子串
java·开发语言·c++·算法·leetcode·哈希算法
big_rabbit05029 小时前
[算法][力扣167]Two Sum II
算法·leetcode·职场和发展
Eward-an10 小时前
LeetCode 76. 最小覆盖子串(详细技术解析)
python·算法·leetcode·职场和发展
不想看见40410 小时前
Reverse Bits位运算基础问题--力扣101算法题解笔记
笔记·算法·leetcode
逆境不可逃11 小时前
LeetCode 热题 100 之 394. 字符串解码 739. 每日温度 84. 柱状图中的最大矩形
算法·leetcode·职场和发展
重生之后端学习11 小时前
62. 不同路径
开发语言·数据结构·算法·leetcode·职场和发展·深度优先