• 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;
        }
    }*/
  • 相关阅读:
    Unity3D-集成Sqlite
    unity3d 规范默认 目录结构
    隐私政策(玩儿英语)
    看漫画学知识:详解获得苹果推荐的4大要素
    加密你的SQLite
    解决JME SDK中文乱码(显示方框)
    Unity安卓共享纹理
    Android/iOS内嵌Unity开发示例
    Unity音量可视化——粒子随声浪跳动
    Windows环境下为Android编译OpenCV4.3
  • 原文地址:https://www.cnblogs.com/legendcong/p/9451841.html
Copyright © 2020-2023  润新知