输出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写法:回溯法

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

浙公网安备 33010602011771号