首页 > 代码库 > [四]combinations
[四]combinations
leetcode系列[四]----combinations
作者:代码牛仔
题目:
Given two integers n and k, return all possible combinations ofk numbers out of 1 ... n.
测试例子:
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]分析:
本题目给出两个整数,让在1-n中选择k个数,给出所有组合方式。这道题目就是一个组合问题。如果这个k是确定的给个循环就搞定问题,没有任何难度。然而难度就在于这个k的不确定,所以循环的层数不能确定,这样一来就不能用k次循环的遍历方式来解决问题。
递归可以解决这一问题,而任何递归算法都有相应的非递归的算法实现。所以我们分开讨论这两种算法。
递归实现:
原理:
递归描述:
如果是从集合A中取出1个数值,则递归结束
如果从集合A中取出的值大于一个,则取出一个之后,重构集合A记为B,递归执行(B,k-1);
代码:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int> > rs;
vector<vector<int> > combine(int n, int k) {
vector<int> nn;
vector<int> surplus;
for(int i=1;i<=n;i++){
surplus.push_back(i);
}
com(nn,surplus,n,k);
return rs;
}
void com(vector<int> newSur,vector<int> surplus,int n,int k){
if(k==1){
for(int i=0;i<surplus.size();i++){
vector<int> temp = newSur;
temp.push_back(surplus[i]);
rs.push_back(temp);
}
}else{
for(int i=0;i<=n-k;i++){
vector<int> temp = newSur;
temp.push_back(surplus[i]);
vector<int> last;
for(int j=i+1;j<surplus.size();j++){
last.push_back(surplus[j]);
}
com(temp,last,last.size(),k-1);
}
}
}
};
int main(){
cout<<"hello world"<<endl;
Solution sl;
vector<vector<int> > rs = sl.combine(4,2);
for(int i=0;i<rs.size();i++){
cout<<"{";
for(int j=0;j<rs[i].size();j++)
{
cout<<rs[i][j];
if(j!=rs[i].size()-1)
cout<<",";
}
cout<<"}"<<endl;
}
//getchar();
return 1;
}