LeetCode(python)78.子集

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

复制代码
输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

思路

每个数字都有两种选择(选/不选)用递归解决:

递归的三要素:

1.递归函数要做什么

(1)对每个数字进行决策,选还是不选

(2)把决策后的子集收集到最终的结果中

2.终止条件------当所有数字都决策过了,就存入此次递归的结果

3.单层逻辑

处理当前第index个元素时,有两种选择:

(1)选当前元素->加入临时子集->继续决策下一个元素

(2)不选当前元素->把它从临时子集中剔除->继续决策下一个元素(回溯)

代码

注意!res.append(temp:),不能写成res.append(temp),这样存的是temp的引用,后续会随着递归而改变

python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []    # 存结果
        temp = []   # 存临时子集

        def dfs(index):
            if index == len(nums):        # 终止条件
                res.append(temp[:])       # 注意!一定要加:,不然存的就是temp的引用,会随着递归时temp的变换而变换,导致最后全为空
                return
            temp.append(nums[index])      # 选当前元素
            dfs(index + 1)                # 继续决策下一个

            temp.pop()                    # 不选
            dfs(index + 1)                # 继续决策下一个
        
        dfs(0)                            # 从第一个元素开始处理
        return res
相关推荐
VidDown3 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
leobertlan4 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的4 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1235 小时前
答案daanC语言
数据结构·算法
小 黄 鸡5 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频5 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林6 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
Navigator_Z6 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook7 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python