zoukankan      html  css  js  c++  java
  • leetcode 22括号生成

    非常好的一道题。一开始的思想是这样的,先把n对括号按照某一顺序生成一个string,然后用全排列算法生成所有可能,然后利用stack写一段判断括号是否匹配的字符串,匹配的假如结果中。不过会超时。因为全排列的复杂度略高,阶乘级别。而对于阶乘函数和指数函数的复杂度,显然是阶乘函数高,指数每次乘一个相同的数(这里是2),而阶乘每次乘一个更大的数.全排列算法复杂度会很大,超时也就不奇怪了。所以对于n对括号,有2n个位置,每个位置都有两种选择,所以一共是4的n次幂。leetcode显示超时也是从n=5开始的,可以想象,超时的原因就是因为5>4,阶乘超越了指数。再引入两个变量记录左括号的数量和右括号的数量,只要满足两个条件1.右括号的数目一定要小于左括号的数量2.左括号的数量和右括号的数量都不能超过n个。满足这两个条件就一定是匹配的。相当于一个非常巧妙的减枝。

    #include<bits/stdc++.h>
    using namespace std;
    class Solution {
    private:
        vector<string>res;
        string ans;
        void permutation(int index,int n,int left,int right)
        {
            if (right > left||left>n||right>n)
                return;
            if (index == 2 * n)
            {
                res.push_back(ans);
                return;
            }
            ans.push_back('(');
            permutation(index + 1, n,left+1,right);
            ans.pop_back();
            ans.push_back(')');
            permutation(index+1, n,left,right+1);
            ans.pop_back();
            return;
        }
    public:
        vector<string> generateParenthesis(int n) {
            permutation(0,n,0,0);
            return res;
        }
    };
    /*int main()
    {
        vector<string>res;
        res= class Solution().generateParenthesis(3);
        for (int i = 0; i < res.size(); i++)
        {
            cout << res[i] << endl;
        }
    }*/
  • 相关阅读:
    Java标签实现分页
    Servlet过滤器介绍之原理分析
    java超强分页标签演示
    Mybatis中resultMap与resultType区别
    洛谷 P1002 过河卒
    洛谷 P2181 对角线
    ACM常数优化
    2020 年百度之星&#183;程序设计大赛
    AtCoder Beginner Contest 171 E
    AtCoder Beginner Contest 171 D
  • 原文地址:https://www.cnblogs.com/legendcong/p/9451841.html
Copyright © 2011-2022 走看看