继续打卡算法题,今天学习的是LeetCode的第22题括号生成,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。
分析一波题目
这道题目一看完,刚看感觉好难,但是我们想通了诀窍之后,就非常简单了。
我们第一个字符肯定是左括号(
,从第二符号开始,就可能是右括号和左括号了。
我们如果使用树来表示,就可以比较容易理解,以n=3为例,我们不断尝试增加左右括号。
从上图已经可以看出可以继续增加括号的规律:
1、如果右边的括号数小于左边括号的数,可以增加括号
2、左边的括号数必须小于n,如果大于等于n,不可以增加左括号了,肯定就不符合有效的括号
编码解决
class Solution {
public List<String> generateParenthesis(int n) {
int left = 0;
int right = 0;
String s = "";
List<String> result = new ArrayList<>();
gen(left, right, n,result, s);
return result;
}
void gen(int left, int right , int n, List<String> result , String s) {
//符合条件的括号组合
if(left == n && right == n) {
result.add(s);
return;
}
//左括号数小于n,可以加左括号
if(left < n) {
//左括号+1
gen(left+1, right, n, result, s+"(");
}
//右括号数小于左括号数,可以加右括号
if(right < left) {
//右括号+1
gen(left, right+1, n, result, s+")");
}
}
}
总结
一看很难的题目,我们一定要举例推导,查找规律,找到规律就找到解题的诀窍,一下子就茅塞顿开了。