LeetCode-22-括号生成

【中等】力扣算法题解析LeetCode22:括号生成 本文介绍了使用回溯法生成所有有效括号组合的算法。给定数字n,生成所有包含n对括号的有效组合。算法通过递归实现,保证左括号数不超过n,右括号数不超过左括号数。Java代码展示了回溯过程,利用StringBuilder优化性能,并通过剪枝避免无效组合。 阅读详情

题目

来源:LeetCode.

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 < = n < = 8 1 <= n <= 8 1<=n<=8

接下来看一下解题思路:

思路:回溯:

    我们可以递归的增加有效的括号;
    如果剩余的左括号数量等于右括号数量,就追加左括号;
    如果剩余的左括号小于右括号,那么既可以追加左括号,也可以追加右括号(优先追加左括号);

public static List<String> generateParenthesis(int n) {
    List<String> list = new ArrayList<>();
    if (n <= 0) {
        return list;
    }
    StringBuffer stringBuffer = new StringBuffer();
    assembleBrackets(list, "", n, n);

    return list;
}

private static void assembleBrackets(List<String> list, String sb, int left, int right) {
    if (left == 0 && right == 0){
        list.add(sb);
        return;
    }
    if (left == right) {
        assembleBrackets(list, sb + L, left - 1, right);
    } else if(left < right) {
        if (left > 0) {
            assembleBrackets(list, sb + L, left - 1, right);
        }
        assembleBrackets(list, sb + R, left, right - 1);
    }
}

    这个每次追加括号是通过字符串类型来保存的;
    其实通过StringBuffer来保存效率更高;

public static List<String> generateParenthesis(int n) {
    List<String> list = new ArrayList<>();
    if (n <= 0) {
        return list;
    }
    StringBuffer stringBuffer = new StringBuffer();
    assembleBrackets(list, stringBuffer, n, n);

    return list;
}
private static void assembleBrackets(List<String> list, StringBuffer sb, int left, int right) {
    if (left == 0 && right == 0){
        list.add(sb.toString());
        return;
    }
    if (left == right) {
        assembleBrackets(list, sb.append(L), left - 1, right);
        sb.deleteCharAt(sb.length() - 1);
    } else if(left < right) {
        if (left > 0) {
            assembleBrackets(list, sb.append(L), left - 1, right);
            sb.deleteCharAt(sb.length() - 1);
        }
        assembleBrackets(list, sb.append(R), left, right - 1);
        sb.deleteCharAt(sb.length() - 1);
    }
}

    使用StringBuffer与String类型不同,这主要是因为这两个的区别:

StringStringBuffer
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量

    所以使用StringBuffer时每次回溯的时候需要删除上一次追加的括号

总结

    时间复杂度: O ( 4 n n ) O(\dfrac{4^n}{\sqrt{n}}) O(n ​4n​),在回溯过程中,每个答案需要 O ( n ) O(n) O(n) 的时间复制到答案数组中。(第 n n n 个卡特兰数 1 n + 1 ( 2 n n ) \dfrac{1}{n+1}\dbinom{2n}{n} n+11​(n2n​),这是由 4 n n n \dfrac{4^n}{n\sqrt{n}} nn ​4n​ 渐近界定的,复杂度分析依赖于理解 g e n e r a t e P a r e n t h e s i s ( n ) generateParenthesis(n) generateParenthesis(n) 中有多少个元素)
    空间复杂度: O ( n ) O(n) O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数需要 O ( 1 ) O(1) O(1) 的空间,最多递归 2 n 2n 2n 层,因此空间复杂度为 O ( n ) O(n) O(n)。

Windows环境下ABAQUS、Fortran 编译器及Visual Studio的安装和关联 点击Continue,在随后的弹窗中勾选accept,并点击Customize(注意,在接下来的安装图片中,显示的版本号是2024.2,图片来自于一次失败的安装,懒得再截图了,步骤毫无区别,请见谅)。在下一步中,保持默认选项,之后软件会自动关联到刚才安装到visual studio,随后下一步进行安装(如果电脑中已经安装有其他版本的visual studio,则只保留2022)。在随后的弹窗中,根据指示找到。以防万一,尽量暂时退出所有杀毒软件,关闭防火墙,一般不会有影响,为确保万无一失,可以执行此步。 阅读详情

相关推荐

Holtek BS45F3833芯片深度剖析:如何用高集成MCU重塑超声波雾化市场格局?

本文深度剖析Holtek BS45F3833芯片如何通过高集成MCU技术重塑超声波雾化市场。该芯片集成了PWM直驱、电容检水、触摸控制等核心功能,显著提升雾化精度和效率,同时降低BOM成本和开发难度。文章通过实测数据和实战案例,展示了其在香薰机、车载设备及工业加湿器等场景的创新应用,为开发者提供了一站式解决方案。

weixin_29192211的博客 410

LeetCode22-括号生成

LeetCode22-括号生成 Leetcode / 力扣 22. 括号生成: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 有效括号组合需满足:左括号必须以正确的顺序闭合。 示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"] 示例 2: 输入:n = 1 输出:["()"] 提示: 1 <= n <= 8 解题思路1: dfs,深度优先搜索,回溯。

baodream的博客 600

大华摄像头GB28181协议接入EasyCVR全流程(附常见错误排查)

本文详细阐述了大华摄像头通过GB28181协议接入EasyCVR视频管理平台的全流程,涵盖从核心原理、前期参数规划、Web界面配置到平台侧验证的完整步骤。重点针对网络端口、SIP参数配置等关键环节提供了深度排错指南,并总结了设备无法注册、在线不稳定、拉流失败等常见问题的排查思路与解决方案,旨在帮助安防工程师与系统集成商高效完成设备接入与调试。

weixin_29279153的博客 307

LeetCode之括号生成

**题目:**数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例: 方法一:回溯法 class Solution { public List<String> generateParenthesis(int n) { List<String> ans = new ArrayList<String>(); backtrack(ans, new StringBuilder(), 0, 0

weixin_44827241的博客 493

手把手教你用certificate-manager修复Vcenter证书过期问题(附密码重置技巧)

本文详细解析了Vcenter证书过期引发的503服务不可用、密码错误等典型故障现象,并提供了使用certificate-manager工具进行系统性修复的完整步骤。文章重点阐述了证书体系原理、精准诊断方法,并分享了在SSO验证失败时通过vdcadmintool重置密码的关键技巧,帮助管理员快速恢复平台并建立预防性运维策略。

swift5iosmith的博客 457

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1575

leetcode:22. 括号生成

题目来源 leetcode:generate-parentheses 题目描述 class Solution { public: vector<string> generateParenthesis(int n) { } }; 题目解析 思路一 分析 如果去除题目中的“有效性”,只考虑组合,那么这个体就变得容易多了。也就是有n个(和n个),有2n个格子,写出所有可能的组合 填入第1个空位后,需要考虑第2个空位需要填什么, 填入第2个空位后,需要考虑第3个空位需要填

OceanStar的博客 541

基于淘宝商城用户购物行为数据分析系统

本文使用HIve+superset技术对阿里云天池提供的淘宝用户购物数据进行处理分析,得到有价值的信息并对平台提出有建设性意义的意见。

m0_51388399的博客 2818

Leetcode刷题详解——括号生成

若此时右括号的数量小于左括号的数量(右括号的数量可以由当前状态的字符串长度减去左括号数量求得),则当前状态的字符串末尾添加右括号并递归,递归结束撤销添加操作。从左往右进行递归,在每个位置判断放置左右括号的可能性,若此时放置左括号合理,则放置右括号继续进行递归,右括号同理。若此时左括号数量小于字符串总长度的一半,则在当前状态的字符串末尾添加左括号并继续递归,递归结束撤销添加操作。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。递归结条件:当前状态字符串长度为2*n相等,记录当前状态并返回。

勇气是明知不可为而为之 676

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 553

DeerFlow 系列教程 第十一篇 | Sandbox 沙箱与 Memory 记忆——安全执行与持久认知

用户请求│▼Lead Agent├── 系统提示词组装│ ├── <memory> 段 ← Memory 系统注入用户记忆│ ├── <skill_system> 段│ └── <subagent_system> 段│├── 工具调用│ ├── read_file ├── Sandbox 系统提供隔离执行│ ├── write_file├── 路径虚拟化 + 安全验证│└── 对话结束│▼│├── 过滤消息(去除工具调用中间步骤)├── 检测纠正/强化信号。

weixin_43674738的博客 161

LeetCode:括号生成

刷题神器:LeetCode官方网站 一、题目还原 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 二、解题思路 回溯法 ① 定义左括号数leftNum,右括号数rightNum,但是leftNum<n时...

郎才女喵的博客 461

基于STM32+ESP8266+手机 APP+阿里云的智能小车设计与实现(项目资料ID:4)

本研究旨在设计一款高度智能化的智能小车系统,通过集成 STM32 微控制器、ESP8266 无线模块、手机 APP 以及阿里云平台,实现环境数据实时采集、远程精准控制和高效的数据交互。详细阐述系统各部分的设计原理、实现过程和测试结果,验证系统在实际应用中的可行性和有效性,为智能小车在多领域的应用提供技术支持。

以培养嵌入式工程师为己任 1万+

【力扣LeetCode】22 括号生成

题目描述(难度中) 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 链接 https://leetcode-cn.com/problems/generate-parentheses/ 思路 显然用栈添加左括号,在...

Jiewang的博客 435

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【算法题】22.括号生成-力扣(LeetCode)

这些组合就两种情况,一种是“(”,一种是“)”,可以很容易想到二叉树,而二叉树可以想到深度优先搜索,而这题的深度优先有要求,就是“(”后面必须要有“)”,不能是“)(”这样的形式。 我们观察发现,符合条件的组合必须得满足两个条件: * 1.括号必须两两配对 * 2.在选择括号进行组合时,“)”的次数始终不能大于“(”的次数,比如说

Janium的博客 695

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LeetCode - 22 括号生成

此时需要注意的是,由于 n == 3,因此生成结果中最多只有3个左括号,3个右括号,因此下面绿色框分支中已经用完了左括号,下一层只能选择右括号。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。回溯算法是基于递归进行的,而递归过程,可以模拟为一颗树的生成过程。每一层节点都有两种选择:左括号 "(" 或着 右括号 ")"树的第六层生成,由于合法括号组合必然是以。分支被剪枝 ,因为其必然不合法。结尾,因此最后一层必然是右括号。,则生成结果必然不合法。但是合法的括号组合,

优快云 1499

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode 22括号生成

LeetCode 22括号生成 题目简述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 输入:n = 3 输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ] 思路:暴力枚举所有括号,生成所有的括号序列,然后用栈逐个检查合法性。 class Solution { public: vector<string> res; vector<string> gener

XBlog 273

#力扣 LeetCode22. 括号生成 @FDDLC

题目描述: 22. 括号生成 - 力扣(LeetCode) (leetcode-cn.com) 自测用例: 1 2 3 4 5 6 7 8 Java代码: class Solution { List<String> ans=new LinkedList<>(); public void go(StringBuilder sb,int n,int l,int r){ if(l==n&&r==n)ans.add(s..

LiuXingchang的博客 395

力扣22.括号生成

力扣,C++,菜菜奋斗日记

2402_88149600的博客 547

《LeetCode力扣练习》第22题 括号生成 Java

《LeetCode力扣练习》第22题 括号生成 Java 一、资源 题目: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"] 示例 2: 输入:n = 1 输出:["()"] 提示: 1 <= n <= 8 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/g

XRT_knives的博客 610

Leetcode22括号生成

Leetcode 22 括号生成 /** * 利用回溯法生成n对正确的括号 */ class Solution { public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>(); backTrack(result, n, 0, 0, 0, new StringBuilder()); return

Loser_you的博客 173

Leetcode 22 括号生成

Leetcode 22 括号生成 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 思路 暴力枚举轻而易举,但是这样的复杂度是吃不消的,也不是这道题的本意 一个简单的方法就是回溯 ...

隔壁家的二大爷 257

22. 括号生成【 力扣(LeetCode) 】

本文介绍了生成有效括号组合的算法。题目要求给定数字n,生成所有可能的n对有效括号组合。采用回溯算法结合剪枝策略的解法:定义回溯函数dfs,当左右括号用完时记录结果;若剩余左括号多于右括号则剪枝;递归尝试放置左括号和右括号。算法时间复杂度O(2^n),空间复杂度O(n)。参考代码展示了具体实现,通过维护字符串状态进行深度优先搜索,最终返回所有有效括号组合。

yyh520025的博客 699

LeetCode 22 括号生成

LeetCode 22 括号生成 题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 分析 第一反应递归,第n代结果可在第n-1的结果上生成。每一代必定有最小单位“()”,所以在上一代所有的‘(’之后尝试插入“...

Ailecccc的博客 272

leetcode22. 括号生成 力扣 java版本

给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] package leetcode; import java.util.ArrayList; import java.util...

mysql表名与列名单引号‘’引发的错误 223

22.括号生成- 力扣(LeetCode)

如果当前左括号剩余数量小于右括号(left < right),说明已添加的左括号多于右括号,此时可安全添加右括号,递归调用减少右括号数量,路径添加右括号。产生右分支的时候,还受到左分支的限制,右边剩余可以使用的括号数量一定得在严格大于左边剩余的数量的时候,才可以产生分支;输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]如果还有左括号可用(left > 0),则递归调用,减少左括号数量,路径添加左括号。left:剩余可用的左括号数量。

2401_87004385的博客 652
上一篇: LeetCode-20-有效的括号
下一篇: LeetCode-23-合并K个升序链表
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值