输出1~n的k个数的组合

来源:好未来春招笔试

题意:给定一个正整数n和k,返回(1,n)的k个数的组合,并按从小到大的顺序排列。

样例:n=4,k=2

输出:[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]

格式:函数接收n和k,返回一个动态二维数组。

 

C++写法:顺序遍历+递归

#include <iostream>
#include <vector>
using namespace std;

void search(vector<vector<int> >& pro,vector<int>& vec,int n,int k,int pos)  //传递vector指针
{
    for(int j=1;pos+j<=n;j++){
        vector<int> tmp = vec;   //用一个新容器进行下一轮迭代,以免污染本轮的数据
        tmp.push_back(pos+j);
        if(tmp.size() != k && pos+j != n)
            search(pro,tmp,n,k,pos+j);
        else if(tmp.size() == k)
            pro.push_back(tmp);
    }
}

vector<vector<int> > promotions(int n, int k) {
        // write code here
    vector<vector<int> > vec;
    vector<int> cop;
    for(int i=1;i<=n-k+1;i++)
    {
        cop.clear();
        cop.push_back(i);
        search(vec,cop,n,k,i);   //递归搜索
    }
    return vec;
}

int main()
{
    int m,n;
    cin >> m >> n;
    vector<vector<int> > vec = promotions(m,n);
    for(int i=0;i<vec.size();i++){
        for(int j=0;j<vec[i].size();j++)
            cout << vec[i][j] << " ";      //输出结果
        cout<<endl;
    }
    return 0;
}

  代码看着有点乱,大致解题思路就是从1遍历到n-k+1,每一次遍历调用search函数继续下一轮遍历,直到k轮遍历后将一维容器的结果加入到二维容器。

运行结果演示:

 

 

另附一位大佬的解题代码

Java写法:回溯法

 

 

 

 

对比下来思路其实差不多,只是我没有回溯而是直接拷贝数组。

posted @ 2021-04-12 14:36  梵蒂冈宝石  阅读(376)  评论(0编辑  收藏  举报