目录
思路
解题方法
复杂度
code
题目:
数字
n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:
输入:n = 1 输出:["()"]提示:
1 <= n <= 8
1.思路
使用递归方法生成所有可能的括号组合。在递归过程中,维护两个计数器,分别表示当前字符串中左括号和右括号的数量,当左括号数量小于 n 时,可以继续添加左括号;当右括号数量小于左括号数量时,可以继续添加右括号。
2.解题方法
使用递归方法,生成所有可能的括号组合。
3.复杂度
时间复杂度:O(4^n / sqrt(n)),其中 n 是生成括号的对数,每个位置都有两种选择,即 '(' 或 ')',总共有 2^(2n) 种可能,但由于每个序列的长度为 2n,因此最终的时间复杂度为 O(4^n / sqrt(n))。
空间复杂度:O(4^n / sqrt(n)),递归调用栈的深度为 2n,因此空间复杂度为 O(n)。
4.code
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<String> generateParenthesis(int n) {
// 创建一个列表用于存储结果
List<String> result = new ArrayList<>();
// 调用递归函数,生成括号组合
generate(result, "", 0, 0, n);
// 返回结果列表
return result;
}
// 递归函数,生成括号组合
private void generate(List<String> result, String current, int open, int close, int n) {
// 如果当前字符串长度等于 2*n,说明括号已经匹配完毕,将当前字符串加入结果列表
if (current.length() == 2 * n) {
result.add(current);
return;
}
// 如果左括号数量小于 n,则可以继续添加左括号
if (open < n) {
generate(result, current + "(", open + 1, close, n);
}
// 如果右括号数量小于左括号数量,则可以继续添加右括号
if (close < open) {
generate(result, current + ")", open, close + 1, n);
}
}
}
欢迎大家留言讨论。
(一份Java面试宝典,有兴趣的读者可以私信我领取!!!免费滴)