当前位置: 首页 > article >正文

【LeetCode 刷题】回溯算法(3)-子集问题

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法子集问题相关的题目解析。

文章目录

  • 78.子集
  • 90.子集II
  • 491.递增子序列

78.子集

题目链接

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res, path = [], []

        def dfs(start: int) -> None:
            res.append(path.copy())
            for i in range(start, len(nums)):
                path.append(nums[i])
                dfs(i + 1)
                path.pop()
        
        dfs(0)
        return res
  • 组合和分割问题都是收集树的叶子结点,而子集问题要收集树的所有节点
  • 因此不需要额外添加判断,进入递归函数即收集答案

90.子集II

题目链接

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res, path = [], []
        nums.sort()

        def dfs(start: int) -> None:
            res.append(path.copy())
            for i in range(start, len(nums)):
                if i > start and nums[i] == nums[i-1]:
                    continue
                path.append(nums[i])
                dfs(i + 1)
                path.pop()
        
        dfs(0)
        return res
  • 相较于上题,此题输入集合中可能存在相同元素,但结果列表中不能有相同的子集
  • 添加排序,以及树层的去重

491.递增子序列

题目链接

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        res, path = [], []

        def dfs(start: int) -> None:
            if len(path) > 1:
                res.append(path.copy())
            layer_used = set()
            for i in range(start, len(nums)):
                if nums[i] in layer_used:
                    continue
                if not path or nums[i] >= path[-1]:
                    layer_used.add(nums[i])  # 记录本层使用过的元素
                    path.append(nums[i])
                    dfs(i + 1)
                    path.pop()
            
        dfs(0)
        return res
  • 与子集问题十分类似,整体代码逻辑基本相同
  • 但在实现树层去重时,不能使用之前的方法:排序 + 判断 nums[i] == nums[i-1],因为对原数组排序后会改变递增性;因此在每一层额外使用集合 layer_used 来记录当前层已经使用过的元素,当元素已经在集合中则跳过

http://www.kler.cn/a/531645.html

相关文章:

  • Java | CompletableFuture详解
  • 【爬虫】JS逆向解决某药的商品价格加密
  • 每日一题——小根堆实现堆排序算法
  • 实验六 项目二 简易信号发生器的设计与实现 (HEU)
  • git笔记-简单入门
  • 基于最近邻数据进行分类
  • 基于脉冲响应不变法的IIR滤波器设计与MATLAB实现
  • 10.8 LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践
  • 【R语言】环境空间
  • 【最后203篇系列】006 -使用ollama运行deepseek-r1前后端搭建
  • Java中的常见对象类型解析
  • 想学习Python编程,应该如何去学习呢
  • ChatGPT怎么回事?
  • Linux环境下的Java项目部署技巧:Nginx 详解
  • powershell编写一个简易的http服务器httpServer
  • 《基于deepseek R1开源大模型的电子数据取证技术发展研究》
  • 计算机组成原理——存储系统(二)
  • 大一计算机的自学总结:数据结构设计相关题
  • 浅谈知识蒸馏技术
  • 【玩转 Postman 接口测试与开发2_014】第11章:测试现成的 API 接口(下)——自动化接口测试脚本实战演练 + 测试集合共享
  • Immutable设计 SimpleDateFormat DateTimeFormatter
  • 如何用一年时间如何能掌握 C++ ?
  • lstm部分代码解释1.0
  • MySQL锁详解
  • 深入探究 Spring 中 FactoryBean 注册服务的实现与原理
  • 【智力测试——二分、前缀和、乘法逆元、组合计数】