LeetCode第22题:生成括号【22/1000 python 递归|动态规划】

news2024/11/18 2:33:43

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作icon-default.png?t=N7T8http://t.csdnimg.cn/Q59WX作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅

LeetCode解锁1000题: 打怪升级之旅icon-default.png?t=N7T8https://blog.csdn.net/cciehl/category_12625714.html
python数据分析可视化:企业实战案例icon-default.png?t=N7T8https://blog.csdn.net/cciehl/category_12615648.html
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

问题描述

给定一个数字 n,要求生成所有可能的并且有效的括号组合。

有效的括号组合需要满足以下条件:

  • 左括号必须以正确的顺序闭合。
  • 左括号和右括号的数量相等。

例如,当 n = 3 时,一个可能的解集为:

[  "((()))",  "(()())",  "(())()",  "()(())",  "()()()"]

解题思路

方法一:递归

解题步骤

要生成所有有效的括号组合,我们可以使用递归来逐步构建字符串。我们维护两个变量:左括号和右括号的剩余数量。在每一步中,我们都有两个选择:

  • 如果左括号的数量不为0,我们可以添加一个左括号。
  • 如果右括号的数量大于左括号的数量,我们可以添加一个右括号。

python示例

  1. 主函数 generateParenthesis

    • 输入参数 n 代表一对括号的数量。
    • 定义了一个内部的辅助函数 backtrack,用于递归构建有效的括号组合。
    • 定义一个列表 results,用来存储所有有效的括号组合。
    • 最后,调用 backtrack 函数并返回 results
  2. 辅助函数 backtrack

    • 接收三个参数:当前累积的括号字符串 accumulated,当前开括号的数量 open_brackets,和当前闭括号的数量 close_brackets
    • 递归的基准情况是当累积的字符串长度达到2n时,此时我们找到了一个有效的括号组合,将其添加到结果列表中。
    • 如果开括号的数量小于n,我们可以添加一个开括号并递归地调用 backtrack
    • 如果闭括号的数量小于开括号的数量,这意味着我们可以添加一个闭括号而不破坏括号的有效性,因此我们再次递归地调用 backtrack,添加一个闭括号。

下面是一个Python示例代码

from typing import List

def generateParenthesis(n: int) -> List[str]:
    def backtrack(accumulated: str, open_brackets: int, close_brackets: int):
        # 当累积的字符串长度达到2n时,表示形成了一个有效的组合
        if len(accumulated) == 2 * n:
            results.append(accumulated)
            return
        # 如果开括号的数量少于n,可以添加一个开括号
        if open_brackets < n:
            backtrack(accumulated + '(', open_brackets + 1, close_brackets)
        # 如果闭括号数量少于开括号,可以添加一个闭括号
        if close_brackets < open_brackets:
            backtrack(accumulated + ')', open_brackets, close_brackets + 1)

    results = []
    backtrack('', 0, 0)
    return results

算法分析

  • 时间复杂度:O(4^n / sqrt(n)),这是基于卡塔兰数的通项公式。
  • 空间复杂度:O(n),递归栈的空间。

方法二:动态规划

动态规划是解决这类问题的另一种有效方法,其基本思想是将问题分解为一系列相关的子问题,并存储这些子问题的解,以避免重复计算。

解题步骤

  1. 定义一个列表 dp 来存储所有解,其中 dp[i] 包含了所有由 i 对括号能组成的有效组合。
  2. 初始化 dp[0] = [""],即没有括号时认为存在一个空的解。
  3. 对于每个 i1n(含),计算 dp[i] 的值:
    • 遍历 j0i-1(含),我们将 dp[i] 的解视为在 dp[j] 的解的基础上添加一对括号,然后在里面填充 dp[i-j-1] 的解。
    • 具体地,对于 dp[j] 中的每个字符串,我们在其外部添加一对括号,然后在这对括号内部尝试插入 dp[i-j-1] 中的所有可能的字符串。

python示例

def generateParenthesis(n: int) -> List[str]:
    dp = [[] for _ in range(n + 1)]
    dp[0] = [""]  # 初始化基础情况
    for i in range(1, n + 1):
        for j in range(i):
            for a in dp[j]:
                for b in dp[i-j-1]:
                    dp[i].append("(" + a + ")" + b)
    return dp[n]

算法分析

动态规划方法相较于递归回溯,具有不同的优势:

  • 时间复杂度:虽然动态规划方法的时间复杂度仍然是指数级的,因为解的数量本身就是指数增长的,但是通过避免重复计算子问题,它可能在某些情况下比纯粹的递归回溯更高效。
  • 空间复杂度:O(n * 卡塔兰数),这是因为需要存储所有由 i 对括号组成的所有有效组合。

应用场景

这个问题不仅是编程面试中的常见问题,也有着广泛的应用场景,例如在编译原理中处理括号匹配问题,在数学中研究卡塔兰数的性质等。

结论

生成所有有效的括号组合是一类经典的算法问题,常见于编程面试和算法竞赛。对于这个问题,主要有两种解决方案:递归回溯和动态规划。每种方法都有其独特的优势和考量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零自制docker-10-【cgroup进行容器资源限制】

文章目录 目的导入包的相关公开原则当前进程的挂载信息deferfor scanner.Scan()判断字符串包含新建的cgroup的默认文件cpu相关配置对应到ubuntu 22.04版本的cpu相关配置top注意查看你可使用的cpu注意坑启动后的top查看显示进程使用的cpu序号代码结果 目的 启动容器时通过-mem、…

Vol.45 这个壁纸网址,功能简单,每月37.7万访问量

哈咯&#xff0c;大家好&#xff0c;我是欧维&#xff0c;今天要给大家分享的网站是&#xff1a;极简壁纸&#xff0c;一个专门做电脑壁纸的网站&#xff1b; 它的网址是&#xff1a;极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 网站的壁纸质量很高&#xff0c;页面…

Java 模块化开发

前言 之前在 Github 下载的好多代码发现都是 Java 模块化开发出来的&#xff0c;模块化是 JDK9 引入的&#xff0c;所以在 JDK9 及其后续的版本中&#xff0c;都可以采用模块化开发的方法来进行项目的开发。尤其是Java桌面应用开发&#xff0c;虽然这只是我的一个业余爱好&…

WindowsServer 2022 AD域控-006-安装副域控

试验拓扑图&#xff1a; 一、测试单域控故障&#xff0c;用户无法修改密码&#xff1b; 域控断网&#xff0c;Win10测试; 二、WindowsServer2022 DC02加入域控&#xff1b; 加入成功 此时域控上只有DC02这台服务器&#xff0c;但DC02并不是域控&#xff1b; 三、WindowsS…

防汛物资仓库管理系统|实现应急物资仓库三维可视化

系统概述 智慧应急物资仓库可视化系统&#xff08;智物资DW-S300&#xff09;采用了 B/S 架构的设计&#xff0c;通过浏览器即可快速登录操作。实现对库房内的应急物资从申购入库、出库、调拨、库内环境监测、维修保养、检测试验、处置报废等全周期、科学、规范的管理。系统以…

使用DockerCompose安装Redis

本文使用docker-compose的方式安装Redis&#xff0c;如何未安装docker-compose&#xff0c;可以参考这篇文章进行安装【在Ubuntu上安装Docker Compose】 一、创建一个DockerCompose配置文件 第一步&#xff1a;创建相关目录文件 为了更好的组织管理Docker容器的配置文件和映射…

python linux服务器ssh简单爆破(测试用户名密码)(连接ssh服务器)(测试登录ssh服务器)

文章目录 背景示例代码代码解释导入模块SSH服务器的地址和端口用户名和密码列表生成所有可能的用户名和密码组合尝试连接到SSH服务器并验证用户名和密码遍历并测试每一对凭证 背景 我们华为摄像头linux终端的密码忘了&#xff0c;还不太好初始化&#xff0c;手动一个个测试太麻…

每日一题——阶乘计算升级版

题目链接&#xff1a; 6-10 阶乘计算升级版 - 基础编程题目集 (pintia.cn) 题目&#xff1a; 6-10 阶乘计算升级版 分数 20 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义&#xff1a; void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff…

Nacos的安装(windows环境下)

1. 下载Nacos安装包 点击下载安装包 将安装包解压到本地目录下&#xff08;路径中不要带中文&#xff09; 修改配置文件 修改为本地M有SQL的用户名和密码&#xff1a; 启动Nacos 1&#xff09;打开nacos文件所在的bin目录下 2&#xff09;用cmd命令行窗口打开在bin目录下 …

Kubernetes的Ingress Controller

前言 Kubernetes暴露服务的方式有一下几种&#xff1a;LoadBlancer Service、ExternalName、NodePort Service、Ingress&#xff0c;使用四层负载均衡调度器Service时&#xff0c;当客户端访问kubernetes集群内部的应用时&#xff0c;数据包的走向如下面流程所示&#xff1a;C…

JS/TS笔记学习1

周末总得学点什么吧~ 奥利给! 跑火车 递归 减速 let currentIndex 0; let speed 500; // 初始速度&#xff0c;单位是毫秒 let decrement 20; // 每次迭代速度减少的量 const cells document.querySelectorAll(.cell); function highlightCell() { cells.forEach(…

vue3 uniapp微信登录

根据最新的微信小程序官方的规定&#xff0c;uniapp中的uni.getUserInfo方法不再返回用户头像和昵称、以及手机号 首先&#xff0c;需获取appID&#xff0c;appSecret&#xff0c;如下图 先调用uni.getUserInfo方法获取code&#xff0c;然后调用后台的api&#xff0c;传入code&…

AI禁区徘徊监测识别摄像机

AI禁区徘徊监测识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;用于监测禁止进入或逗留的区域。这种摄像机通过高清摄像头实时捕捉场景图像&#xff0c;利用AI算法对人员徘徊行为进行识别和监测&#xff0c;有助于提高安全防范水平&#xff0c;减少潜在的安全风险…

免费分享Springboot+Vue的影院管理系统源码,真酷!

今天给大家分享一套基于SpringbootVue的影院管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文末自取) 一、系统运行图 1、登陆页面 2、系统后台 3、选座功能 影院管理系统通常具有以下七个功能点&#xff1a; 1.电影管理&#xff1a; 包括电影信…

CMC学习系列 (8):动态力输出期间的伽马范围皮质相干性

CMC学习系列:动态力输出期间的伽马范围皮质相干性 0. 引言1. 主要贡献2. 方法3. 结果4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1053811906010238 论文题目&#xff1a;Gamma-range corticomuscular coherence duri…

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets 4.1 Clock and clock enables 时钟和时钟使能 Cortex-R52处理器具有一个单一的时钟&#xff0c;驱动着所有的触发器和RAM。各种输入&#xff0c;包括复位输入&#xff0c;都有同步逻辑使它们可以与处理器时钟异步操…

C语言 | Leetcode C语言题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; char pairs(char a) {if (a }) return {;if (a ]) return [;if (a )) return (;return 0; }bool isValid(char* s) {int n strlen(s);if (n % 2 1) {return false;}int stk[n 1], top 0;for (int i 0; i < n; i) {char ch pair…

模型训练-保存训练数据

1.目的 找到一个可运行的代码&#xff0c;可以每个epoch打印训练数据&#xff0c;但是不会保存。因为在改进模型需要这些训练数据进行对比&#xff0c;所以需要将每个epoch的训练数据保存下来&#xff0c;写到一个文件中。 2.解决方案1 直接问ChatGPT&#xff0c;提示词如下…

5.4Python之可变类型与列表的深浅拷贝

【1】可变类型与不可变类型 在Python中&#xff0c;数据类型可以分为可变类型&#xff08;Mutable&#xff09;和不可变类型&#xff08;Immutable&#xff09;。这指的是对象在创建后是否可以更改其值或状态。 不可变类型是指创建后不能更改其值或状态的对象。如果对不可变类…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点&#xff1a;电流小&#xff0c;工作频率高 选型依据&#xff1a;正向电流、正向压降、功耗&#xff0c;反向最大电压&#xff0c;反向恢复时间&#xff0c;封装等 类型&#xff1a;BAS316 ; IN4148WS 应用电路: 说明&#xff1a;应用…