今天还是比较的简单的 只是去理解了机理就可以了 具体代码如下:
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
public:
void backstring(int n,int k,int startindex){
if(path.size()==k){
result.push_back(path);
return;
}
for(int i=startindex;i<=n;i++){
path.push_back(i);
backstring(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backstring(n,k,1);
return result;
}
};
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
public:
void backstring(int n,int k,int startindex){
if(path.size()==k){
result.push_back(path);
return;
}
for(int i=startindex;i<=n+1-(k-path.size());i++){
path.push_back(i);
backstring(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backstring(n,k,1);
return result;
}
};
后面就是一个剪枝操作 也很简单 主要的思想就是 后面还要去搜索n-i+1这么多个元素 但是一共需要k个 因此如果剩下的比k-m 也就是k-path.size() 这么多个少的话 就没必要搜索了 因此就是n-i+1要大于等于k-path.size() 弄回来就是
就是你完全也可以去这么写:for(int i=startindex;n+1-i>=k-path.size();i++) 就是这样子 也不用非得把i归到一边