[路飞]_Leetcode 22. 括号生成

「括号生成」提醒我们:多占一格空间,有时是在为时间买路。

------ 耶夫托维斯基

Hello,大家好,今天继续刷 LeetCode 热题 100。

这篇要解决的是 22. 括号生成。

前言

「括号生成」的核心不在代码量,而在于找到正确的数据结构、状态定义或遍历顺序。下面按题目、思路、代码和复杂度把它一步步拆开。

1、题目描述

给定 n,生成所有由 n 对括号组成的有效括号组合。

2、解题思路

回溯时记录已使用的左、右括号数。左括号还没用完就能继续放;右括号只有在 right < left 时才能放,这个不变量保证任意前缀都不会出现右括号更多的非法情况。长度达到 2 * n 时收集答案。

3、代码实现

js 复制代码
var generateParenthesis = function(n) {
  const ans = [];
  const dfs = (left, right, path) => {
    if (path.length === 2 * n) return ans.push(path);
    if (left < n) dfs(left + 1, right, path + '(');
    if (right < left) dfs(left, right + 1, path + ')');
  };
  dfs(0, 0, '');
  return ans;
};

4、复杂度分析

时间为卡特兰数规模,递归空间 O(n)。

5、思路总结

  • 核心方法:回溯时记录已使用的左、右括号数
  • 关键点:左括号还没用完就能继续放
  • 实现提醒:右括号只有在 right < left 时才能放,这个不变量保证任意前缀都不会出现右括号更多的非法情况

结语

以上就是「括号生成」的解法。先把关键状态和不变量想清楚,再落到代码,复杂问题也会清晰很多。

相关推荐
ZhengEnCi20 分钟前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
Dxy12393102162 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷2 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
吞下星星的少年·-·4 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
圣保罗的大教堂4 小时前
leetcode 453. 最小操作次数使数组元素相等 中等
leetcode
椒哥4 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
aichitang20244 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码5 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
kyriewen5 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员