[力扣]22. 括号生成

[力扣]22. 括号生成,第1张

[力扣]22. 括号生成
class Solution {
    bool check(string u){
        int l = 0;
        for(int i = 0;i < u.length();i++){
            if(u[i] == '(') l ++;
            else l --;
            if(l < 0) return false;
        }
        return !l;
    }
public:
    vector generateParenthesis(int n) {
        string u;
        vector res;
        for(int i = 0;i < n;i++) u += "()";
        sort(u.begin(),u.end());
        do{
            if(check(u)) res.push_back(u);
        }while(next_permutation(u.begin(),u.end()));
        return res;
    }
};

这道题可以通过借助next_permutation函数和括号合法性检测来实现。
这是我优化后的写法。

题目中n的最大取值为8,但采用无剪枝的递归仍会超时
如下代码所示。

超时代码
class Solution {
private:
    vector res;
    int n;
    void insertParenthesis(string u){
        if(u.length() / 2 == n){
            bool exist = false;
            for(auto it : res){
                if(it == u){
                    exist = true;
                    break;
                }
            }
            if(!exist) res.push_back(u);
            return;
        }
        for(int i = 0;i < u.length() + 1;i++){
            string v = u.substr(0,i) + "()" + u.substr(i);
            insertParenthesis(v);
        }
    }
public:
    vector generateParenthesis(int n) {
        this->n = n;
        insertParenthesis("");
        return res;
    }
};

经过计算,该代码在最大规模的情况时计算次数约为 34459425 34459425 34459425次,而第一份代码的计算次数为 8 ! = 40320 8! = 40320 8!=40320次左右。因此实际时间复杂度相差了约1000倍。


题目链接
原创不易,感谢支持!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5715140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存