• LeetCode OJ-- * Combinations


    在1 - 10 中,求出 7 个数的排列组合。

    出现了超时,而超时的原因是有好多重复情况,复杂度上来说,和答案的复杂度是一样的,但是答案中重复了太多了,体会下。

    超时1:

    class Solution {
    public:
        vector<vector<int> > combine(int n, int k) {
            vector<vector<int> > ans;
            if(n < k || n <= 0 || k <= 0)
                return ans;
            
            vector<int> ansPiece;
            set<int> checkExist;
            for(int i = 1; i <= n; i++)
            {
                ansPiece.clear();
                ansPiece.push_back(i);
                checkExist.clear();
                checkExist.insert(i);
                if(k > 1)
                    combine(ans,ansPiece,k,n,checkExist);
            }
            return ans;
        }
        void combine(vector<vector<int> > &ans, vector<int> &ansPiece, int &k, int &n, set<int> &checkExist)
        {
            if(ansPiece.size() == k)
            {
                vector<int> temp = ansPiece;
                ans.push_back(temp);
                return;
            }
            for(int i = 1; i <=n; i++)
            {
                if(checkExist.find(i) == checkExist.end())
                {
                    ansPiece.push_back(i);
                    checkExist.insert(i);
                    combine(ans,ansPiece,k,n,checkExist);
                    ansPiece.pop_back();
                    checkExist.erase(i);
                }
            }
        }
    };

    超时2:

    class Solution {
    public:
        vector<vector<int> > combine(int n, int k) {
            vector<vector<int> > ans;
            if(n < k || n <= 0 || k <= 0)
                return ans;
            
            vector<int> ansPiece;
            set<int> checkExist; //记录还没有选的元素
            for(int i = 1; i <= n; i++)
            {
                checkExist.insert(i);
            }
            
            combine(ans,ansPiece,k,checkExist);
            
            return ans;
        }
        void combine(vector<vector<int> > &ans, vector<int> &ansPiece, int &k, set<int> &checkExist)
        {
            if(ansPiece.size() == k)
            {
                vector<int> temp = ansPiece;
                ans.push_back(temp);
                return;
            }
            set<int>::iterator itr;
            for(itr = checkExist.begin(); itr != checkExist.end(); itr++)
            {
                ansPiece.push_back(*itr);
                set<int> check2 = checkExist;
                check2.erase(*itr);
                combine(ans,ansPiece,k,check2);
                ansPiece.pop_back();
            }
        }
    };

    正确的:(控制了顺序)

    class Solution {
    public:
        vector<vector<int> > combine(int n, int k) {
            vector<vector<int> > ans;
            if(n < k || n <= 0 || k <= 0)
                return ans;
            
            vector<int> ansPiece;
            int start = 1;
            combine(ans,ansPiece, k,n, start);
            
            return ans;
        }
        void combine(vector<vector<int> > &ans, vector<int> &ansPiece, int &k, int &n, int start)
        {
            if(ansPiece.size() == k)
            {
                vector<int> temp = ansPiece;
                ans.push_back(temp);
                return;
            }
            
            for(int i = start; i <= n; i++)
            {
                if(n - i + 1 < k - ansPiece.size())
                    return;
                ansPiece.push_back(i);
    
                combine(ans,ansPiece,k,n,i+1);
    
                ansPiece.pop_back();
            }
        }
    };
  • 相关阅读:
    ClassLoader机制:一个类何时会被虚拟机初始化?
    单例模式(含多线程处理)
    代理模式
    Java反射机制深度剖析
    python3.8、3.9安装
    日常随手记
    redux源码阅读之compose,applyMiddleware
    Chrome字体变粗
    JavaScript遍历树结构
    JavaScript 通过队列实现异步流控制
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3959843.html
Copyright © 2020-2023  润新知