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], ]
主要思路:
模拟加法器。
算法时间: 8ms。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> v;
vector<vector<int>> vc;
if(k > n || k < 1)
return vc;
for(int i = 1;i<=k;i++)
{
v.push_back(i);
}
vc.push_back(v);
while(1)
{
if(v[k-1]+1 > n)//需要考虑进位的情况
{
int tmpi = 2;//表示数组v中倒数第tmpi位
while(k-tmpi >=0)//从后往前寻找一个最合适的位置进行加1
{
if(v[k-tmpi] < n - tmpi + 1) //如果当前位置合适的话
//将[1, 4]变为[2, 3]的过程
{
v[k - tmpi] += 1;
int t1= v[k-tmpi] + 1;
for(int i = k - tmpi+1;i<k;i++)
{
v[i] = t1;
t1++;
}
vc.push_back(v);
break;
}
else //如果当前位置不合适,则需要继续往前数
tmpi++;
}
if(k < tmpi)//当进行到最前面那位都无法进行加法,则表示所有结果都已经被找到,停止搜索
break;
}
else //如果最后一位持续符合要求
{
v[k-1] += 1;
vc.push_back(v);
}
}
return vc;
}
};