LeetCode刷题记录(4)-20231219

LeetCode刷题记录
------分割线------
刷题记录4: 22.括号生成


文章目录

  • 前言
  • 一、题目内容
  • 二、自己的思路
  • 三、自己的代码实现
  • 四、精选代码
  • 总结


前言

想到什么写什么:

上周参加了华为技术面,面的不太好,大概率挂掉了,心情不佳,故有几日未输出,只能说还是要自己多磨练自己的技术,其实华为问的挺八股的,只能说自己没准备好吧,再接再励,半年后再来。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目内容

LeetCode刷题记录(4)-20231219_第1张图片

二、自己的思路

	其实这个方法的开头,就是以(开头,拿一个变量统计)可以出现的次数,每出现一个(,变量就+1,每出现一个),变量就-1,然后拿一个变量记录(出现的次数,等于n时,就不再增加,同时用stringbuilder存储对象,每次从上一个方法跳出的时候,需要减掉最新加入的值,其实都是回溯,很简单。

三、自己的代码实现

public static char[] array = {'(',')'};

public static List generateParenthesis(int n) {
    List 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 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);
        }
    }
}

LeetCode刷题记录(4)-20231219_第2张图片
执行效率还行,就是空间复杂度高了些。

四、精选代码

大佬展示了深度优先遍历和广度优先遍历两种解法,这就偷懒不贴了。我复制测试了一下,时间上并不快,空间也差不多,但是需要吸取的是这两种思想,万变不离其宗,但太晚了,暂时不想看。

总结

上周去上海和4个老友相聚,小酌三篇,意犹未尽,但可能太放松了,以至于华为的技术面面的很糟糕,其实有一半是自己之前有准备的,但不知道为什么在回答的时候就是脑海一片空白,可能还是紧张,所以自己需要在这块上多磨练,希望明年自己能有所突破吧,别浑浑噩噩过日子了,已经混沌的过了2年多了,不思进取的过了8年了,该醒一醒了。

你可能感兴趣的:(leetcode,算法,职场和发展)