Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
Example:
Input: n = 4, k = 2 Output: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
问题描述看样例就很清楚:给定k和n,n代表从1到n的集合,k表示从1到n取k个元素组成子集合。
递归的方法,当子集合元素个数为k时,将该子集合存入结果并返回;当子集合最后一个元素小于它前一个元素,返回;其余情况递归。
class Solution {
private:
void help(int index, int n, int k, vector<int>tem, vector<vector<int>>&result){
if(tem.size()==k) {//将该子集合存入结果
result.push_back(tem);
return;
}
if( tem.size()>1 && tem.back()<*(tem.end()-2) ) return;//tem的元素个数>=2,最后一个元素小于它前一个元素,非递增序列则返回
for(int i=index+1;i<=n;i++){
tem.push_back(i);//放入元素
help(i,n,k,tem,result);
tem.pop_back();//弹出
}
}
public:
vector<vector<int>> combine(int n, int k) {
vector<int> tem;
vector<vector<int>> result;
help(0,n,k,tem,result);
return result;
}
};