
- 总共有 n 对括号 → 每个组合长度 = 2n
- 每次递归有两种选择:
放 (
放 )(前提是右括号数 < 左括号数) - 递归树深度 = 2n
python
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = []
# 只有左右括号,待选列表里不用放其他的,只用放左右括号数字,平不平衡?
# left: 左括号剩余数量
# right: 右括号剩余数量
# tmp: 已有排列
def backtrack(left, right, tmp):
# 剩余括号全用完 → 收集结果
if left == 0 and right == 0:
res.append(tmp)
return
# 先放左括号,再放右括号
# 还可以放左括号
if left > 0:
backtrack(left - 1, right, tmp + "(")
# 还可以放右括号
if right > left: #
backtrack(left, right-1, tmp + ")")
backtrack(n, n, "")
return res
空间复杂度:O(n)O(n)O(n)
-
递归栈深度 = 2n → O(n)
-
在每一层递归中,tmp + "(" 会创建一个新的字符串。由于是深度优先搜索(DFS),内存中在同一时刻只会存在从根节点到当前节点的一条路径上的字符串。这条路径上所有字符串长度的总和为 1+2+3+...+2n≈O(n2)1 + 2 + 3 + ... + 2n \approx O(n^2)1+2+3+...+2n≈O(n2)
-
额外空间复杂度就是 O(n)O(n)O(n) 或 O(n2)O(n^2)O(n2)(取决于是否严格计算每层产生的临时字符串)。
时间复杂度 :O(4nnn)O\left(\frac{4^n}{n\sqrt{n}}\right)O(nn 4n)
-
生成的序列数量:生成的所有合法括号组合的数量正是第 nnn 个卡特兰数 (Catalan Number),Cn=1n+1(2nn)C_n = \frac{1}{n+1}\binom{2n}{n}Cn=n+11(n2n)
当 nnn 较大时,根据斯特林公式近似,它的量级约为
O(4nnn)O\left(\frac{4^n}{n\sqrt{n}}\right)O(nn 4n)字符串操作开销:在每一条有效路径的末尾,执行了
res.append(tmp)。因为 tmp 的长度是 2n2n2n,所以复制字符串需要 O(n)O(n)O(n)
的时间。
总结:严格来说,时间复杂度是有效组合数乘以生成每个组合的代价。
但通常在面试中,回答其复杂度与卡特兰数成正比,
约为:
O(4n)O(4^n)O(4n) 的量级即可。
即,如果不考虑剪枝限制:
每层 2 个分支 → 完全二叉树大小 = 2^(2n) = 4^n
所以上界是 4^n