题目描述
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],
]
思路:回溯法
构造一个辅助函数,combine_helper.
(1)递归一次,填入一个数字
(2)填入的数字,不能是小于当前数字的值,防止重复
(3)结束条件,当填入的数字达到k个数字时,当前填写完毕,回溯;
(4)回溯:pop_back()最后加上的一个数字,回溯到上一层.
实现代码:
class Solution {
public:
vector<vector<int> > combine(int n, int k) {
vector<vector<int>> ret;
if(n==0||k==0||n<k) return ret;
vector<int> path;
combine_helper(1,0,n,k,path,ret);
return ret;
}
voidcombine_helper(intstart,intnum,intn,intk,vector<int>&path,vector<vector<int>>&ret)
{
if(num==k)
{
ret.push_back(path);
return;
}
for(int i=start;i<=n;i++)
{
path.push_back(i); //压入当前值;
combine_helper(i+1,num+1,n,k,path,ret); //准备压入下一个数,更新个数
path.pop_back(); //弹出最近刚压入的数,进行循环的下一个数;
}
}
};