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], ]解析:
1. 使用递归方法,comb表示从begin位置的k个数的组合
2. 使用bit方法,对于2的n次方个数,判断每个数中1的个数是不是k,如果是K则返回对应的组合。
代码:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>>ans;
vector<int>path;
comb(n,ans,path,1,k);
return ans;
}
void comb(int n,vector<vector<int>>&ans,vector<int>&path,int begin,int k)
{
if (path.size()==k)
{
ans.push_back(path);
return ;
}
for (int i=begin; i<=n; i++)
{
path.push_back(i);
comb(n,ans,path,i+1,k);
path.pop_back();
}
return ;
}
};
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>>ans;
int numcnt=pow(2,n);
for (int i=0; i<numcnt; i++)
{
if (Numberof1(i)!=k)
continue;
vector<int>path;
for (int j=0; j<n; j++)
{
if ((i>>j)&1)
{
path.push_back(j+1);
}
}
ans.push_back(path);
}
return ans;
}
int Numberof1(int n)
{
int count=0;
while (n)
{
count++;
n=n&(n-1);
}
return count;
}
}