输出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写法:回溯法
对比下来思路其实差不多,只是我没有回溯而是直接拷贝数组。