首页 > 其他分享 >LeetCode 22. 括号生成 回溯写法详解

LeetCode 22. 括号生成 回溯写法详解

时间:2024-08-11 21:52:29浏览次数:15  
标签:组合 22 ans 生成 括号 回溯 path LeetCode

22. 括号生成

22. 括号生成

题目来源

22. 括号生成

题目分析

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

题目难度

  • 难度:中等

题目标签

  • 标签:数组, 回溯

题目限制

  • 1 <= n <= 8

解题思路

生成有效的括号组合,可以使用回溯算法。对于每个位置,我们可以选择放左括号或右括号。为了生成有效的组合,需要保证在任何位置,右括号的数量不能超过左括号的数量。
其实可以看成是2*n个位置,每个位置有两种选择,选择左括号,和不选择左括号即选右括号,这两种情况都向下递归就好了,只不过还要注意要用有效括号组合的约束条件剪枝。

核心算法步骤

  • 回溯算法
    1. 使用一个 StringBuilder 来记录当前路径(已经生成的括号串)。
    2. 遍历 2n 个位置:
      • 如果左括号数量还没有达到 n,则可以放一个左括号。
      • 如果右括号数量少于左括号数量,则可以放一个右括号。
    3. 当路径长度等于 2n 时,生成一个有效的括号组合,将其加入到结果集中。

代码实现

以下是生成符合条件的括号组合的 Java 代码:

/**
 * 22. 括号生成
 * @param n 输入的整数n
 * @return ans 所有可能的组合
 */
public List<String> generateParenthesis(int n) {
    List<String> ans = new ArrayList<>();
    StringBuilder path = new StringBuilder();
    generateParenthesis(n, 0, path, ans);
    return ans;
}

private void generateParenthesis(int n, int i, StringBuilder path, List<String> ans) {
    if (path.length() == 2 * n) {
        ans.add(path.toString());
        return;
    }
    // 选择 左括号 i为左括号个数
    if (i < n) {
        path.append("(");
        generateParenthesis(n, i + 1, path, ans);
        path.deleteCharAt(path.length() - 1);
    }
    // 选择 右括号
    if (path.length() - i < i) {
        path.append(")");
        generateParenthesis(n, i, path, ans);
        path.deleteCharAt(path.length() - 1);
    }
}

代码解读

  • 回溯逻辑

    • generateParenthesis 方法用于生成所有有效的括号组合。通过递归的方式,分别在每个位置选择添加左括号或右括号。
    • i 表示当前已经添加的左括号的数量。左括号的数量不能超过 n,且右括号的数量不能超过当前的左括号数量。
  • 路径管理

    • 使用 StringBuilder 管理当前生成的路径,生成一个有效的组合后,使用 ans.add(path.toString()) 将其加入结果集中。
    • 在递归回溯时,使用 deleteCharAt 方法撤销最后一次操作,以恢复到上一步的状态。

性能分析

  • 时间复杂度O(2^n),由于回溯算法会尝试生成所有可能的括号组合(无效组合会被剪枝)。
  • 空间复杂度O(n),递归调用栈的最大深度为 2*n

测试用例

你可以使用以下测试用例来验证代码的正确性:

int n = 3;
List<String> result = generateParenthesis(n);
System.out.println(result);
// 输出: ["((()))", "(()())", "(())()", "()(())", "()()()"]

int n2 = 1;
List<String> result2 = generateParenthesis(n2);
System.out.println(result2);
// 输出: ["()"]

扩展讨论

优化写法

在回溯过程中,可以根据剩余左右括号的数量提前判断是否可能生成有效的组合,以减少无效组合的生成,提升效率。

其他实现

除了回溯法,动态规划也可以用来解决括号生成问题。通过构造递归方程,可以从较小的子问题逐步构造出最终的解。

总结

这道题目通过回溯算法帮助我们理解了如何生成所有有效的括号组合。该算法的核心是递归地选择放置左括号或右括号,并通过路径管理和剪枝优化来提高效率。这种思路可以有效地解决类似的组合生成问题。


标签:组合,22,ans,生成,括号,回溯,path,LeetCode
From: https://blog.csdn.net/Lentr0py/article/details/141112542

相关文章

  • LeetCode 216. 组合总和 III 回溯写法详解
    216.组合总和III216.组合总和III题目来源题目分析题目难度题目标签题目限制解题思路核心算法步骤代码实现代码解读性能分析测试用例扩展讨论优化写法其他实现总结216.组合总和III题目来源216.组合总和III题目分析题目要求找出所有相加之和为n的k......
  • ubuntu22.04下载源码安装Wireshark最新版
      https://blog.csdn.net/QQ896710872/article/details/137346698 http://ftp.uni-kl.de/pub/wireshark/src/all-versions/ 1.下载Wireshark最新版。2.下载好后解压:tar-xfwireshark-4.2.4.tar.xz3.解压后进入解压好的文件夹:cdwireshark-4.2.44.安装需要用到的工具,代......
  • 2024暑假集训测试22
    前言比赛链接。今天题好难啊,大多数人T2、T4改不动都不改了,下午miaomiao进来和我们说模拟赛改不动的题可以不改。部分分给的也很少。T1Mortis原题:[ABC302G]Sortfrom1to4。\(O(n)\)桶排序,知道每个数最后应该去哪,那么对于需要交换的只有三种情况:二者错排,交换......
  • Leetcode 热题100 - 155 最小栈
    Leetcode热题100-155最小栈1.题目描述2.解题思路3.代码实现(方法二)4.c++知识点用法1.题目描述155最小栈2.解题思路方法一:创建一个辅助栈min_stk用以存储当前元素相对应的栈中最小元素值;方式二:类似于方法一,使用pair<int,int>同时存储当前元素与其对应......
  • Leetcode-3129 找出所有稳定的二进制数组I
    Leetcode-3129找出所有稳定的二进制数组I1.题目描述2.解题思路3.代码实现1.题目描述3129找出所有稳定的二进制数组I2.解题思路(1)定义f[i][j][k]表示i个0、j个1且当前位i+j填写值为k=0/1的所有情况;(2)对于f[i][0][0]、f[0][j][1]初始化为1,注意到:......
  • Leetcode-3132 找出与数组相加的整数II
    Leetcode-3132找出与数组相加的整数II1.题目描述2.解题思路3.代码实现1.题目描述3132找出与数组相加的整数II2.解题思路(1)排序后,注意到nums1数组比nums2数组多两个元素,可推出最小匹配元素一定在nums[0]、nums[1]、nums[2]中出现;(2)优先从nums[2]进行判......
  • Windows11 24H2 + MSSQL 2022 Developer安装匹配
    时间一晃好久没折腾这个了,因LenovoG500太老破旧(Windows7+MSSQL2014Developer,不想折腾更换),直到6月份挂掉再维修也没价值了,只好临时用了另外一个AcerASpire4750(8G+120GSSD),当时其实也没打算更换到Windows10,只是之前的U盘启动盘坏掉,临时做了个其他U盘启动盘(非老毛桃、大白菜......
  • 「LeetCode Top100」之滑动窗口
    3.无重复字符的最长子串题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked题目难度:中等标签:哈希表、字符串、滑动窗口题目状态:学习题解思路:滑动窗口的思路,也就是维持一个无......
  • 【Oracle点滴积累】Oracle 19c安装Critical Patch Update for April 2022
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享如何为Oracle19c安装CriticalPatchUpdate(PatchNumber:33806138),本指引不包含RollBack部分。mkdir/home/oracle/Patchmkdir/home/oracle/PatchZipmkdir/home/oracle/Backup_ORACLE_H......
  • 算法笔记|Day22回溯算法IV
    算法笔记|Day22回溯算法IV☆☆☆☆☆leetcode491.递增子序列题目分析代码☆☆☆☆☆leetcode46.全排列题目分析代码☆☆☆☆☆leetcode47.全排列II题目分析代码☆☆☆☆☆leetcode332.重新安排行程(待补充)题目分析代码☆☆☆☆☆leetcode51.N皇后(待补充)题目分析......