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:
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]This is solution is not efficient, but interesting.
class Solution {
public:
vector<vector<int> > combine(int n, int k) {
vector<vector<int> > res;
if(n == 1)
{
res.push_back(vector<int>({1}));
return res;
}
if(k == 1) n++;
for(int i=1;i<n;i++)
{
res.push_back(vector<int>({i}));
}
for(int j=1;j<k;j++)
{
int size = res.size();
for(int i=0;i<size;i++)
{
for(int w=res[i][j-1]+1;w<=n;w++)
{
res.push_back(res[i]);
res[res.size()-1].push_back(w);
}
}
res.erase(res.begin(), res.begin() + size);
}
return res;
}
};
Backtracing
class Solution {
public:
vector<vector<int> > combine(int n, int k)
{
vector<vector<int>> res;
vector<int> vec;
generate(1, n,k,res,vec);
return res;
}
void generate(int start, int n, int k,
vector<vector<int>>& res, vector<int>& vec)
{
if(k==0)
{
res.push_back(vec);
return;
}
for(int i=start;i<=n;i++)
{
vec.push_back(i);
generate(i+1,n,k-1,res,vec);
vec.pop_back();
}
}
};