2019-06-23抓紧时间更新一波不然一会儿就走了还有可能被一堆考试的赶走哈哈哈哈哈哈吃了蛋黄酥瓜子和枣片的我好撑啊今儿手气好抽了个SP和SSR最近为什么这么欧可能真的是否极泰来吧希望好运不要用完呀

今天就刷了一道力扣,一道中等难度的题,感觉力扣的题的顺序还是很良心的,做难的前面有个铺垫,各种数据结构掺杂着来,尽快熟悉一下。

这道题是括号的生成,是对上一道题检测括号是否正确的一个延伸,想了大概两个小时……

第一个思路,就是比较随意的适合小题目的,“随机法”生成再排除错误的答案。检查错误的直接用上一个的代码就好了吧,随机生成不如说是全排列,全排列的数目应该是小于随机生成的的,当然我觉得可能会超时,就没写下去。解题区第一个就是用的这个方法,但是不是C++,是python。随机产生的话,我觉得防在set里比较好,能排除相同元素。

第二个思路就是回溯法,之前就觉得这个很神奇,在百度C++排列组合问题时,看到了全排列用这个做的,于是想到这道题应该 也可以,然而并不能写出来。想了想就看了解答区的人的答案。

贴个别人的代码mark一下:

class Solution {
public:
    vector<string>ans;
    void backtrace(string temp,int n){
        if(temp.length()==2*n){
            ans.push_back(temp);
            return;
        }
        if(left<n){
            temp.push_back('(');
            left++;
            backtrace(temp,n);
            left--;
            temp.pop_back();
          }
        if(right<n&&right<left){
            temp.push_back(')');
            right++;
            backtrace(temp,n);
            right--;
            temp.pop_back();
          }    
}
    vector<string> generateParenthesis(int n) {
        backtrace("",n);
        return ans;
    }
};

一位大大说的好,回溯法重要的是知道从哪退出,大概我目前没能力想出来出口在哪里……这段代码的意思就是,先生成所有的左括号,每增加一次backtrace一下,当left=n时,添加右括号,当左右都满了之后,开始终止当前层,回到上一层,删除一个右括号后再删除一个左括号,再在该层生成右括号,简言之就是“) (”这样的删除顺序,然后再添加相应数目的括号,凑齐2n,push_back一下,第一层完成后,推出回溯,进行输出。

发布了42 篇原创文章 · 获赞 16 · 访问量 2897

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/93383453