[路飞]_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 时才能放,这个不变量保证任意前缀都不会出现右括号更多的非法情况

结语

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

相关推荐
isyoungboy1 小时前
事件驱动状态机与循环扫描状态机:两种计算模型的比较研究
算法·状态机
JAVA老架构AI智能化1 小时前
多图叠加比对
前端·javascript·chrome
longlongzihan2 小时前
LeetCode 24.两两交换链表中的节点:虚拟头结点与指针
算法·leetcode·链表
residual_fan2 小时前
基于控制感知域对抗网络的变工况故障诊断:从控制系统与运行状态协同的角度建立模型
人工智能·算法·数据挖掘·数据分析
踏月了无痕2 小时前
01写一个简单的API服务
javascript
Xin7702 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树(递归分治法)
leetcode
翻山越岭的少年2 小时前
用控制信号理解状态变化:基于控制感知域对抗网络的变工况故障诊断
算法
志尊宝2 小时前
Vue3 零基础每日笔记(081):富文本编辑器集成 wangEditor 5——封装
前端·javascript·vue.js·笔记·信息可视化·echarts
longlongzihan2 小时前
从LeetCode 19. 删除链表的倒数第 N 个结点深入理解“哨兵节点”
c++·算法·leetcode·链表