zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    };
  • 相关阅读:
    [笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger
    DOSbox汇编集成环境下的具体设置
    nginx的 CPU參数worker_processes和worker_cpu_affinity使用说明
    【数据压缩】LZW算法原理与源代码解析
    [javase学习笔记]-8.1 statickeyword之特点
    开源工作流CCBPM中关于解决谷歌等浏览器silverlight的问题
    “建议127:Lock与synchronized是不一样的问题”实际验证
    java线程同步问题——由腾讯笔试题引发的风波
    Centos6.5下安装protobuf及简单使用
    linux, configure --prefix=/有什么用
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3959843.html
Copyright © 2011-2022 走看看