zoukankan      html  css  js  c++  java
  • Combinations

    题目:Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

    For example,
    If n = 4 and k = 2, a solution is:

    [
      [2,4],
      [3,4],
      [2,3],
      [1,2],
      [1,3],
      [1,4],
    ]

    思路:回溯法+动态规划

    更加推荐第一种解法。第二种实在没有能够理解。以后的回溯法尽量使用本模型。

    我将本答案的解法过程一一列举,应该能够容易理解。

    进入第二个循环的时候,先是进入2,进入第三个循环,发现满了,保存,返回,退出,继续进入3,以此类推。

    1,2,– 1,3 — 1,4 —  …



    第二种方法是:用answer中的长度作为结束条件,还有一个条件就是写入的值不能大于n,这个是第二条件了。

    不过在最后,要加上combineHelper(n,k,start+1,answer,result);不然只是求解了一个插入首字母的结果。

    不过,这不是最完美的回溯法的典型程序,可以参考我之后的求解和的程序。

    代码:


    class Solution1 {
    public:
        void combineHelper(int n,int k,int start,vector<int> &answer,vector<vector<int> >&result){
            if(answer.size()==k){
                result.push_back(answer);
                return;
            }   //answer暂时保存k位数字
    
            if(answer.size()>k){//节省不必要浪费时间
                return;
            }
    
            for(int i=start;i<=n;i++){
                answer.push_back(i);
                combineHelper(n,k,i+1,answer,result);
                answer.pop_back();
            }
            //虽然这边写的是删除一个值,但是因为是迭代,所以第一个函数运行到这边的时候,
            //实际相当于把第一次的一整个vector清空,验证这个可以通过把下面的那个语句屏蔽到
            //发现只能生成一组vector。
            //这个程序谨记,第一次遇到。
            //所以下面的值为start+1,而不是start+2.
    
        }
    
        vector<vector<int> > combine(int n, int k) {
            vector<vector<int> >result;
            vector<int>answer;
            combineHelper(n,k,1,answer,result);
            return result;
        }
    };



    class Solution2 {
    public:
        void combineHelper(int n,int k,int start,vector<int> &answer,vector<vector<int> >&result){
            if(answer.size()==k){
                result.push_back(answer);
                return;
            }   //answer暂时保存k位数字
            if(start>n){
                return;
            }
            
            answer.push_back(start);
            combineHelper(n,k,start+1,answer,result);
            answer.pop_back();
            //虽然这边写的是删除一个值,但是因为是迭代,所以第一个函数运行到这边的时候,
            //实际相当于把第一次的一整个vector清空,验证这个可以通过把下面的那个语句屏蔽到
            //发现只能生成一组vector。
            //这个程序谨记,第一次遇到。
            //所以下面的值为start+1,而不是start+2.
            combineHelper(n,k,start+1,answer,result);
        }
        
        vector<vector<int> > combine(int n, int k) {
            vector<vector<int> >result;
            vector<int>answer;
            combineHelper(n,k,1,answer,result);
            return result;
        }
    };



  • 相关阅读:
    在MYSQL中插入当前时间,就象SQLSERVER的GETDATE()一样,以及对mysql中的时间日期操作。
    mysql使用default来设置字段的默认值
    MySQL关于check约束无效的解决办法
    C# 加密算法汇总
    REST,Web 服务,REST-ful 服务
    C# HTML 生成 PDF
    SQL Server Connection Pooling (ADO.NET)
    ADO.NET Connection Pooling at a Glance
    正则表达式
    开发 ASP.NET vNext 初步总结(使用Visual Studio 2015 Preview )
  • 原文地址:https://www.cnblogs.com/jsrgfjz/p/8519908.html
Copyright © 2011-2022 走看看