leetcode22. 括号生成

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

题目

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思路

1.递归,控制左括号和右括号个数。
2.注意区分错误解法,与其他递归回溯leetcode17. 电话号码的字母组合不同的地方在于其他地方每次更改暂存值之后都会回溯至上一次位置,但此处容易被忽略导致值无法回溯。这里的关键参数都是简单类型,所以可以直接更改实参的值而不用中间变量回溯。
3.递归回溯的正确解法见解法4

实现

解法1

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if (n == 0) return {};
        string tmp;
        vector<string> res;
        tmp.push_back('(');
        func(1, 0, n, tmp, & res);
        return res;
    }
    void func(int left, int right, int n, string tmp, vector<string>* res) {
      
        if (left == n) {
            if (right == n) {
                res->push_back(tmp);
            }
            if (right < n) {
                func(left, right + 1, n , tmp + ")", res);
            }
        } else if (left < n) {
            if ( left == right) {
                func(left + 1, right, n , tmp + "(", res);
            }
            if (left > right) {
                func(left + 1, right, n , tmp + "(", res);
                func(left, right + 1, n , tmp + ")", res);    
            }
        }
        
    }
};

解法2

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        add(n, n, res, "");
        return res;
    }
    void add(int left, int right, vector<string>& res, string path) {
        if (left == 0 && right == 0) {
            res.push_back(path);
            return;
        }
        if (left > 0) {
            add(left - 1, right, res, path + "(");
        }
        if (right > 0 && right > left) {
            add(left, right - 1, res, path + ")");
        }
    }
};

解法3错误

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        add(n, n, res, "");
        return res;
    }
    void add(int left, int right, vector<string>& res, string path) {
        if (left == 0 && right == 0) {
            res.push_back(path);
        }
        if (left > 0) {
            path += "(";
            add(left - 1, right, res, path);
        }
        if (right > 0 && right > left) {
        // 错误的原因是此处path的值已经被更改多次,而不是一次
            path += ")";
            add(left, right - 1, res, path);
        }
    }
};

解法4
错误解法修正:
若想使用中间变量回溯到上一次位置且值不被修改,需要在每次更改值后恢复原样

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if (n == 0) return {};
        string tmp;
        vector<string> res;
        tmp.push_back('(');
        func(1, 0, n, &tmp, & res);
        return res;
    }
    void func(int left, int right, int n, string* tmp, vector<string>* res) {
      
        if (left == n) {
            if (right == n) {
                res->push_back(*tmp);
            }
            if (right < n) {
                tmp->push_back(')');
                func(left, right + 1, n , tmp, res);
                tmp->pop_back();
            }
        } else if (left < n) {
            if ( left == right) {
                tmp->push_back('(');
                func(left + 1, right, n , tmp, res);
                tmp->pop_back();
            }
            if (left > right) {
                tmp->push_back('(');
                func(left + 1, right, n , tmp, res);
                tmp->pop_back();
                tmp->push_back(')');
                func(left, right + 1, n , tmp, res);    
                tmp->pop_back();
            }
        }
    }
};
DAVIS前言:事件相机资料调研 Event-Camera 资料集锦 1. 官网资料 假设了你买了事件相机,就可以在以下几个链接了解相关的参数和gui界面安装,如果不喜欢gui界面安装,可以第2节,安装相关的源码驱动。 DVS/DAVIS产品说明 等相关产品的软硬件介绍。 iniVation DV教程文档 给出在不同平台下的dvs-gui界面,可按照其说明进行相应的操作。 另外,Neuromorphic vision com... 阅读详情

相关推荐

SAP 货币类型和公司代码的货币设置

货币类型分为公司代码和集团货币,一般FI 10类型和集团货币 30,事务代码是8KEM; 设置货币类型的事务代码是OB22 在S/4 1809版本里编辑功能统合到事务代码FINSC_LEDGER 中了,这里集中了分类账和公司代码的设置; 设置多账簿的币种(会出现在BSEG和FAGLFLEXA表中) 汇率维护在TCURR表中,可通过BAPI_EXCHANGERATE_GETDETAIL函数获取。 CO货币的事务代码是成本控制范围货币:OKKP ,一般设置为货币码20和30; 另外, SCC4设置集团货币,

RichardYang2020的博客 1万+

【力扣LeetCode】22 括号生成

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

Jiewang的博客 435

解决在封装自定义IP时加入ila,或者其他ip核时出错的情况

在查阅很多资料后,明白了这个应该是软件bug,但是最终还是解决了问题 我们只需要删除

weixin_42553916的博客 3604

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

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

Janium的博客 695

Android HCE模拟NFC标签:实现跨设备NDEF数据共享

本文详细介绍了Android HCE技术如何模拟NFC标签实现跨设备NDEF数据共享。通过核心代码实现和标准AID配置,使手机能够被第三方NFC应用直接读取,支持文本、网址、Wi-Fi配置等多种数据类型,大幅提升设备间数据交换的便捷性和兼容性。

pytorch8learner的博客 248

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 354

LeetCode - 22 括号生成

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

优快云 1499

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

那么,什么是AI Agent?简单来说,AI Agent是一种能够感知环境、做出决策并采取行动的自主系统。自主性:能够在没有人类直接干预的情况下运行,对自己的行为和内部状态有一定的控制权。反应性:能够感知环境的变化,并及时做出反应。主动性:不仅能够对环境变化做出反应,还能够主动地设定目标并采取行动实现这些目标。社会性:能够与其他Agent(包括人类和人工智能)进行交互、协作和竞争。它们可以全天候不间断地监控和处理海量信息,大大提升信息处理能力;

AI大模型应用之禅 188

LeetCode 22括号生成

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

XBlog 273

qt工程引入opencv库步骤

第一步:新建qt工程 第二步:在工程名.pro文件中添加opencv库的路径                   INCLUDEPATH += /home/liyuanzhe/opencv-2.4.8/include/opencv \ /home/liyuanzhe/opencv-2.4.8/include/opencv2 LIBS += /home/liyuanzhe/open

superyuanzhe的专栏 5722

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

#力扣 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

当AI学会写“自传”:OpenClaw 的 SOUL.md 如何把配置文件变成一颗会变形的心

SOUL.md。

步子哥的博客 1309

力扣22.括号生成

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

2402_88149600的博客 547

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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-括号生成

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

baodream的博客 600

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-22 括号生成

LeetCode22 dp做法: 包含n个括号组的字符串结果,取决于n-1个括号组的字符串结果 假设n-1个括号组的字符串形式有k种 则有:n个括号组的字符串 = “(” + p个括号组结果 + “)” + q个括号组结果 其中p + q = n-1 将p个括号组结果从 0 -> n-1遍历一遍,就会得到所有可能的n个括号组的字符串组合 n=0:返回空 n=1:返回"()" class Solution { public: vector<string> generateParen

CC_且听风吟丶的博客 517

【力扣22】括号生成

数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。❌ 嵌套的情况应该是在剩余部分最外侧嵌套,这种写法会导致下次递归会在嵌套外侧修改。path设置为string类型,排列的情况只需path = () + path;嵌套的情况:front = front+(;嵌套的情况:path = ( + path + );设置前front,待定path,后back三段;排列的情况:front = front+();括号的两种关系:排列,嵌套;无法构造 (())();

weixin_63567927的博客 386

leetcode 22 括号生成

leetcode 22 括号生成 思路:看起来比较难 关键:必须满足任意时刻左括号数目大于等于右括号个数 过程: dfs广度搜索,从0号开始搜索,left代表左括号个数,right表示右括号个数 dfs中若左右括号都等于n,则表示找到一个符合要求的字符串 只要满足left<n,则可以添加做括号 满足left>right,则可以添加右括号 若left<right则剪枝 class Solution { public: vector<string> ans; v

qq_43582620的博客 256

力扣22,括号生成

力扣22题,括号的生成,DFS,动态规划,回溯,递归

sxycylq的博客 125
上一篇: leetcode13. 罗马数字转整数
下一篇: leetcode24. 两两交换链表中的节点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值