首页 > 其他分享 >LeetCode22:括号生成

LeetCode22:括号生成

时间:2024-11-01 18:19:54浏览次数:4  
标签:组合 pos 生成 current 括号 result LeetCode22

原题地址:. - 力扣(LeetCode)

题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

实现思路

题目要求生成所有有效的括号组合。有效的括号组合是指每个左括号 ( 都有对应的右括号 ),且在任意前缀中左括号的数量不少于右括号的数量。

思路:

  1. 回溯法:使用回溯法生成所有可能的括号组合。可以用一个字符数组 current 来存储当前的组合。
  2. 递归生成:在每个位置上可以选择放入左括号或右括号。
  3. 验证有效性:在生成完整的组合后,通过一个辅助函数检查该组合是否有效。
  4. 结束条件:当字符数组填满时,检查组合的有效性,并将有效的组合添加到结果列表中。

源码实现

class Solution {
    public List<String> generateParenthesis(int n) {
        // 创建一个列表来存储所有有效的括号组合
        List<String> combinations = new ArrayList<String>();
        // 调用递归函数生成所有可能的组合
        generateAll(new char[2 * n], 0, combinations);
        return combinations;
    }

    public void generateAll(char[] current, int pos, List<String> result) {
        // 如果当前位置到达数组末尾
        if (pos == current.length) {
            // 检查当前组合是否有效
            if (valid(current)) {
                // 如果有效,添加到结果列表
                result.add(new String(current));
            }
        } else {
            // 在当前位置放入左括号
            current[pos] = '(';
            generateAll(current, pos + 1, result); // 递归生成下一位置的组合
            
            // 在当前位置放入右括号
            current[pos] = ')';
            generateAll(current, pos + 1, result); // 递归生成下一位置的组合
        }
    }

    public boolean valid(char[] current) {
        int balance = 0; // 用于跟踪括号的平衡情况
        for (char c : current) {
            if (c == '(') {
                ++balance; // 左括号增加平衡
            } else {
                --balance; // 右括号减少平衡
            }
            // 如果平衡小于零,说明右括号多于左括号,组合无效
            if (balance < 0) {
                return false;
            }
        }
        // 只有当平衡为零时,才说明所有括号有效
        return balance == 0;
    }
}

复杂度评估

  • 时间复杂度

    • 最坏情况下,算法会生成 O(2^(2n)) 种组合,这是由于每个位置都有两种选择(( 或 )),且组合的长度为 2n
    • 然而,实际上有效的组合数量是 Catalan 数 C(n) = (2n)! / ((n+1)! * n!),因此实际生成的组合数会远少于 O(2^(2n))
  • 空间复杂度

    • 使用的空间主要是 result 列表和 current 数组。current 数组的长度为 2n,而 result 列表存储所有有效组合,最多为 O(C(n))
    • 总体空间复杂度为 O(n)(用于存储 current 数组)加上 O(C(n))(存储有效组合),所以可以认为是 O(C(n))

标签:组合,pos,生成,current,括号,result,LeetCode22
From: https://blog.csdn.net/qq_36070104/article/details/143438111

相关文章

  • 在使用echarts绘制图表时, 如果需要使用渐变色, 则应使用echarts内置的渐变色生成器ec
    series:[{name:'',type:'bar',barMaxWidth:20,label:{show:true,color:'#fff',},showBackground:true,backgroundStyle:{color:'#d5f1f9&......
  • Golang 开源库分享:faker - 随机生成有趣的假数据!
    GitHub仓库链接:https://github.com/bxcodec/faker简介在开发和测试过程中,我们经常需要各种各样的测试数据。如果手动去生成这些数据,不仅耗时,还容易出错。faker是一个Go语言的假数据生成库,可以快速生成各种字段的随机数据。这个库可以帮我们轻松生成各种属性的假数据,比如姓名......
  • 高并发场景下的抢红包系统设计:实时拆分与预先生成方案的比较与优化
    引言在之前面试中经常会问到的一个经典场景问题是如何设计一个抢红包系统。我之前的项目场景中也会涉及到群红包的业务逻辑。今天我们来一起讨论下这个业务场景设计。这个问题不仅考察我们对高并发处理的理解,还涉及到数据库设计、缓存优化、分布式锁控制等技术细节。在“......
  • 基于 LLM 的小众脚本语言(某仿真软件 DSL)生成方案
    某仿真软件现状新建仿真项目后,工程中的模型只能依靠编辑其自带的脚本语言来进行增删改,业务人员的学习成本极高。网上的资料也很少,Github上都只能找到一个该软件的项目代码。文档也基本只有该软件自带的文档,社区基本没有,好在文档写的比较详实。目前打算去尝试的解决方案基于Co......
  • 管家婆财贸ERP BB072.销售单草稿明细生成组装拆分单
    最低适用版本:财贸系列22.0插件简要功能说明:销售单草稿明细支持生成组装拆分单入库明细更多细节描述见下方详细文档插件操作视频:进销存类定制插件--销售单草稿明细生成组装拆分单插件详细功能文档:1.应用中心增加报表菜单【销售单草稿明细生成组装拆分单】a......
  • 随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
    随机性在诸多领域中扮演着至关重要的角色,涵盖密码学、仿真和机器学习等方面。因为随机性为无偏决策、不可预测序列和安全加密提供了基础。然而生成随机数是一项复杂的任务,理解伪随机数生成(pseudo-randomnumbergeneration,PRNG)与真随机数生成(truerandomnumbergeneration......
  • 织梦DedeCMS生成静态文件速度缓慢的解决方案
    问题:DedeCMS网站数据量大时,生成静态页面速度非常慢。解决方法:修改 inc_fun_SpGetArcList.php 文件:打开 include/inc/inc_fun_SpGetArcList.php 文件。找到以下代码:for($i=0;$i<$ridnum;$i++){if($tpsql=="")$tpsql.="And((".TypeGetSunID($reids[$i],$......
  • Python深度学习进阶与前沿应用(注意力机制详解、生成式模型详解、自监督学习模型详解、
    近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型(BERT、GPT-1/2/3/3.5/4、DETR、ViT、SwinTransformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Di......
  • 生成10个随机数并求平均值 输出小于平均值的个数
    #include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){srand(time(NULL));//设置种子intarr[10]={0};//在数组中存入10个数字intlen=sizeof(arr)/sizeof(int);//计算长度ints=0;for(inti=0;i<len;i++){intnum......
  • 【C++】01-C++ 程序的生成过程
    概要:该篇文章以MSCV为例,简要介绍了C++程序的生成过程。1.生成工具MSVC,全称MicrosoftVisualC++,是由微软开发的用于生成C++程序的工具集,包括C++预处理器、编译器、链接器和其他生成工具。2.生成过程2.1预处理(Preprocess)预处理由预处理器(Preprocessor)......