菜鸡每日一题系列打卡22天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题目分析
本题是一道枚举所有有效的括号组合的题目,像这类题目,一般比较容易想到的方法是暴力组合然后筛选,回溯,以及动态规划三种方法,本文采用经典的dfs算法进行实现,力求代码简洁,逻辑清晰。
代码实现
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList();
dfs(result, "", n, n);
return result;
}
public void dfs(List<String> result, String current, int left, int right){
// 剪枝
if (left > right) return;
// 有效的括号组合
if (right == 0) {
result.add(current);
return;
}
// 有可用的'('
if (left > 0) dfs(result, current + '(', left - 1, right);
// 有可用的')'
if (right > 0) dfs(result, current + ')', left, right - 1);
}
}
代码分析
对代码进行分析,枚举过程的时间复杂度是指数级别的,而就空间而言,如果不考虑返回结果所占用的空间,则占用的空间取决于递归深度,因此,空间复杂度为O(n)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到