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

代码随想录算法训练营Day24

力扣22.括号生成【medium】
力扣39.组合总和【medium】
力扣40.组数总和Ⅱ【medium】

一、力扣22.括号生成【medium】

题目链接:力扣22.括号生成
在这里插入图片描述

视频链接:灵茶山艾府

1、思路

  • 可以理解成2n个位置选n个位置放置左括号

  • 从输入的视角:枚举当前位置填左括号还是右括号?本质上是「选或不选」,把填左括号视作「选」,填右括号视作「不选」。(也可以反过来)。

  • 时间复杂度: O ( n ∗ C m n ) O(n*C_m^n) O(nCmn)

    • 分析回溯问题的时间复杂度,有一个通用公式:路径长度×搜索树的叶子数。但由于左右括号的约束,实际上没有这么多叶子,根据 Catalan 数,只有 C m n n + 1 \frac{C_m^n}{n+1} n+1Cmn 个叶子节点,所以实际的时间复杂度为 O(C_m^n)。此外,根据阶乘的 Stirling 公式,时间复杂度也可以表示为 O ( 4 n n ) O( \frac{4^n}{\sqrt{n}}) O(n 4n)

2、代码

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        m = n * 2
        ans =[]
        path = [''] * m
        def dfs(i, open):
            if i == m:
                ans.append(''.join(path))
                return
            if open < n:
                path[i] = '('
                dfs(i+1, open + 1)
            if i - open < open :
                path[i] = ')'
                dfs(i+1, open)
        dfs(0,0)
        return ans

二、力扣39.组合总和【medium】

题目链接:力扣39.组合总和
在这里插入图片描述
视频链接:代码随想录
题解链接:灵茶山艾府

1、思路

  • 和组数总和Ⅲ有点类似,那边数组的长度是固定的并且不可以重复,这便是不固定可以重复使用,这边也多设置一个参数left表示还差多少完成target的目标。
  • 终止条件:当left == 0就可以存储答案
  • 单层逻辑:选或者不选,**注意这边选的话递归还是本次的i,**由于是可以重复使用的,这和之前的回溯递归不一样的地方
  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n) ,注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此

2、代码

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        ans = []
        path = []

        def dfs(i:int, left:int):
            if left == 0:
                ans.append(path.copy())
                return
            if i == len(candidates) or left < 0:
                return
            # 不选i
            dfs(i+1, left)

            path.append(candidates[i])
            # 这边允许元素重复使用,所以递归的话是i而不是i+1
            dfs(i, left - candidates[i]) # 这边i不是数本身,而是数组的索引
            path.pop()
        
        dfs(0, target)
        return ans
        

三、力扣40.组数总和Ⅱ【medium】

题目链接:力扣40.组数总和Ⅱ
在这里插入图片描述

视频链接:代码随想录
题解链接:灵茶山艾府

1、思路

  • 本题和39题的区别是,我们的候选仓库 candidates 中的元素是可以重复的,里面的元素却不可以重复使用,
  • 所以实际上这边不选某个元素的时候要特殊处理,比上一题来的复杂
  • 我们可以先排序一下,比较好处理重复元素,并且可以做到一个优化剪枝
  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n) ,注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此

2、代码

"""
注意:本题和39题的区别是,我们的候选仓库 candidates 中的元素是可以重复的,里面的元素却不可以重复使用,
      所以实际上这边不选某个元素的时候要特殊处理,比上一题来的复杂
"""
class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort() # 先从小到大排个序
        n = len(candidates)
        ans = []
        path = []

        def dfs(i:int, left:int):
            if left == 0:
                ans.append(path.copy())
                return

            if i == len(candidates):
                return

            x = candidates[i]
            if left < x:
                return

            path.append(x)
            dfs(i+1, left - x)
            path.pop()

            # 不选 x,那么后面所有等于 x 的数都不选
            # 如果不跳过这些数,会导致「选 x 不选 x'」和「不选 x 选 x'」这两种情况都会加到 ans 中,这就重复了
            i += 1
            while i < n and candidates[i] == x:
                i += 1
            dfs(i,left)

        dfs(0,target)
        return ans

3、代码问题

  • 这边我一开始只注意到不可以重复使用,直接在上一题的基础上快速修改了,就报错了……
  • 这道题的元素仓库本来就有重复的元素,所以我需要处理这个细节,否则我的ans中就有很多重复答案。

http://www.dtcms.com/a/122379.html

相关文章:

  • 第1章 对大型语言模型的介绍
  • SQL优化技术分享:从 321 秒到 0.2 秒的性能飞跃 —— 基于 PawSQL 的 TPCH 查询优化实战
  • 栈与队列及其基础应用
  • 【Kafka基础】topic命令行工具kafka-topics.sh:基础操作命令解析
  • STM32低功耗
  • 数据结构--堆
  • 软件测试之功能测试详解
  • C++语法学习之路
  • Mac监控新风尚:酷炫界面,性能监控更直观!
  • 数字图像处理作业4
  • SQLite 中日期型数据定义及处理(Delphi 版本)
  • IDEA :物联网ThingsBoard-gateway配置,运行Python版本,连接thingsboard,接入 MQTT 设备
  • [ACM_1] 输入输出 | 多行 | 多组 | getline(cin,s) | cin处理
  • 【MySQL】——事务的隔离性
  • Dubbo的简单介绍
  • 数据分析-Excel-学习笔记Day1
  • LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵
  • Ubuntu22.04——YOLOv8模型训练到RK3588设备部署和推理
  • 实现抗隐私泄漏的AI人工智能推理
  • Linux进程控制:fork、exit与waitpid的江湖恩怨
  • C# 根据指定路径、文件格式、创建日期清理文件夹内文件,包括子目录
  • 从Transformer到世界模型:AGI核心架构演进
  • 微信小程序 -- 原生封装table
  • UV安装与使用
  • asp.net core 项目发布到 IIS 服务器
  • 场外期权只适合上涨行情吗?
  • CSS语言的游戏AI
  • ResNet改进(18):添加 CPCA通道先验卷积注意力机制
  • 从个人博客到电商中台:EdgeOne Pages的MCP Server弹性架构×DeepSeek多场景模板实战解析
  • 1.VTK 使用CMakeLists