LeetCode刷题记录
------分割线------
刷题记录4: 22.括号生成
前言
想到什么写什么:
上周参加了华为技术面,面的不太好,大概率挂掉了,心情不佳,故有几日未输出,只能说还是要自己多磨练自己的技术,其实华为问的挺八股的,只能说自己没准备好吧,再接再励,半年后再来。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目内容
二、自己的思路
其实这个方法的开头,就是以(开头,拿一个变量统计)可以出现的次数,每出现一个(,变量就+1,每出现一个),变量就-1,然后拿一个变量记录(出现的次数,等于n时,就不再增加,同时用stringbuilder存储对象,每次从上一个方法跳出的时候,需要减掉最新加入的值,其实都是回溯,很简单。
三、自己的代码实现
public static char[] array = {'(',')'};
public static List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
StringBuilder str = new StringBuilder("(");
// )可以出现的次数
int count = 1;
// 出现(的次数
int leftNums = 1;
addItem(list,str,count,leftNums,n);
return list;
}
public static void addItem(List<String> list,StringBuilder str,int count,int leftNums,int n){
if(str.length()==2*n){
list.add(str.toString());
return;
}else if(leftNums==n){
str.append(array[1]);
addItem(list,str,count-1,leftNums,n);
str.deleteCharAt(str.length()-1);
}else if(count==0){
str.append(array[0]);
addItem(list,str,count+1,leftNums+1,n);
str.deleteCharAt(str.length()-1);
}else{
for(int i=0;i<=1;i++){
str.append(array[i]);
if(i==0){
addItem(list,str,count+1,leftNums+1,n);
}else{
addItem(list,str,count-1,leftNums,n);
}
str.deleteCharAt(str.length()-1);
}
}
}
执行效率还行,就是空间复杂度高了些。
四、精选代码
大佬展示了深度优先遍历和广度优先遍历两种解法,这就偷懒不贴了。我复制测试了一下,时间上并不快,空间也差不多,但是需要吸取的是这两种思想,万变不离其宗,但太晚了,暂时不想看。
总结
上周去上海和4个老友相聚,小酌三篇,意犹未尽,但可能太放松了,以至于华为的技术面面的很糟糕,其实有一半是自己之前有准备的,但不知道为什么在回答的时候就是脑海一片空白,可能还是紧张,所以自己需要在这块上多磨练,希望明年自己能有所突破吧,别浑浑噩噩过日子了,已经混沌的过了2年多了,不思进取的过了8年了,该醒一醒了。