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.递归算法一定要思路清晰,勿忘注意边界值的处理,递归参数要慎重。
2.DFS是一种搜索策略,本题可以转换成对问题求解空间的深度搜索(暴力穷举)。
方法1:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
return subCombine(1,n,k);
}
vector<vector<int>> subCombine(int start,int end,int k){
if(k==1){
vector<vector<int>> temp;
for(int i=start;i<=end;++i){
vector<int> subTemp;
subTemp.push_back(i);
temp.push_back(subTemp);
}
return temp;
}
vector<vector<int>> res;
for(int i=start; i<=end-k+1; ++i){
vector<vector<int>> temp = subCombine(i+1,end,k-1);
for(int j=0; j<temp.size();++j){
temp[j].insert(temp[j].begin(),i);
res.push_back(temp[j]);
}
}
return res;
}
};
方法二(DFS):
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
dfs(1,n,k,0);
return res;
}
void dfs(int start, int end, int k, int cur){
if(k==cur){
res.push_back(temp);
}
for(int i=start;i<=end;++i){
temp.push_back(i);
dfs(i+1,end,k,cur+1);
temp.pop_back();
}
}
private:
vector<vector<int>> res;
vector<int> temp;
};
注意:一开始直接写return dfs(1,n,k,0); 在输入比较大的时候超时。为什么方法一不超时?