leetcode hot100【LeetCode 22.括号生成】java实现

server/2024/12/2 13:09:59/

LeetCode 22.括号生成

题目描述

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

有效括号组合需满足如下条件:

  1. 左括号的数量必须等于右括号的数量。
  2. 在任何前缀中,左括号的数量不能小于右括号的数量。

示例:
输入:n = 3
输出:

["((()))","(()())","(())()","()(())","()()()"
]

Java 实现解法

java">import java.util.*;public class Solution {public List<String> generateParenthesis(int n) {List<String> result = new ArrayList<>();backtrack(result, "", 0, 0, n);return result;}private void backtrack(List<String> result, String current, int open, int close, int n) {// 如果当前字符串长度达到最大长度,添加到结果列表if (current.length() == n * 2) {result.add(current);return;}// 如果左括号的数量小于 n,可以添加左括号if (open < max) {backtrack(result, current + "(", open + 1, close, n);}// 如果右括号的数量小于左括号的数量,可以添加右括号if (close < open) {backtrack(result, current + ")", open, close + 1, n);}}
}

代码说明

  1. generateParenthesis(int n):该方法是问题的入口,负责调用回溯函数 backtrack() 来生成所有合法的括号组合。
  2. backtrack(List<String> result, String current, int open, int close, int max):这是递归函数,负责在字符串 current 中添加括号,直到构建出一个合法的组合。递归中,open
    表示已经添加的左括号数量,close 表示已添加的右括号数量,max 表示一共可以使用多少对括号。
  3. 递归结束条件:当字符串 current 的长度达到 2 * n 时,表示已经生成了一个合法的括号组合,加入结果列表。
  4. 添加括号的规则
    • open 小于 n 时,可以添加一个左括号。
    • close 小于 open 时,可以添加一个右括号。

解题思路

本题可以使用回溯(Backtracking)算法来解决。回溯的核心思想是递归地构建括号组合,直到满足条件为止。

  1. 递归结构:我们可以用两个计数器来分别追踪已用的左括号和右括号数量。对于每一个位置,若左括号的数量小于 n,就可以添加一个左括号;若右括号的数量小于左括号的数量,就可以添加一个右括号。

  2. 回溯条件

    • 递归停止的条件是当左括号和右括号的数量都等于 n 时,说明生成了一个有效的括号组合。
    • 递归树的左右分支分别表示在当前位置添加左括号或右括号。
  3. 有效性检查:在递归过程中,始终保持左括号的数量不小于右括号的数量。只有在左括号数量小于 n 时,才能继续添加左括号;当右括号数量小于左括号数量时,才能继续添加右括号。

复杂度分析

  • 时间复杂度:回溯算法的时间复杂度是指数级的。每个递归调用都有两个选择(加左括号或右括号),最多会递归 2^n 次,但由于我们限制了递归的分支,这样的情况不会发生。因此,最终的时间复杂度为 O(4^n / sqrt(n))

  • 空间复杂度:空间复杂度主要来自递归调用栈。每一层递归都会用到常数空间,因此,最坏情况下,空间复杂度为 O(n)


http://www.ppmy.cn/server/140597.html

相关文章

selenium大量并发连接驱动超时

我的业务是根据数据生成一大片报表图&#xff0c;组成一个word文档&#xff0c;量大概10~100之间&#xff0c;挨个执行太慢了&#xff0c;15分钟左右&#xff0c;为了加快速度使用了多线程&#xff0c;而多线程又被机器速度限制&#xff0c;一旦跑的多了&#xff0c;就会有线程…

智能电网能源优化管理系统(Smart Grid Energy Optimization Management System, SGEOMS)

1.产品介绍 产品介绍方案 产品名称 智能电网能源优化管理系统(Smart Grid Energy Optimization Management System, SGEOMS) 主要功能 能源生产优化能源输送优化能源分配优化能源使用优化功能介绍 能源生产优化 具体作用:通过对现有能源生产过程的优化和建立新的能源生产…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

PythonBase02

列表 list 定义 由一系列变量组成的可变序列容器。 列表内存 """ 列表内存图 &#xff11;&#xff15;&#xff1a;&#xff14;&#xff10; 练习:exercise04.py exercise05.py exercise06.py""" list01 ["张无忌&quo…

Github 2024-11-05 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-11-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HTML项目1TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (二)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 &#xff08;二&#xff09; 一、前言 目前鸿蒙应用的实现逻辑&#xff0c;基本都是参考和移植Android端来实现。针对BLE低功耗蓝牙来说&#xff0c;在鸿蒙化的实现过程中。我们发现了&#xff0c;鸿蒙独有的优秀点&#xff0c…

Linux上的各种查询

在Linux中&#xff0c;有许多命令可以用于查询系统信息、文件和进程等。以下是一些常用的查询命令及其简要介绍&#xff1a; ls: 用途&#xff1a;列出目录中的文件和子目录。示例&#xff1a;ls -l&#xff08;以详细格式显示&#xff09;或 ls -a&#xff08;包括隐藏文件&am…

LeetCode题练习与总结:字典序排数--386

一、题目描述 给你一个整数 n &#xff0c;按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;[1,10,11,12,13,2,3,4,5,6,7,8,9]示例 2&#xff1a; 输入&am…