77. 组合
这道题跟着Carl视频做下来的。原理是懂了,但看视频的时候没太仔细看,我原以为是要把path也传递下去,其实是不用的。需要传递的三个参数是数组长度、取数range和目前所取数的index。另外,要注意for loop里i需要小于等于n,因为如果不加上等于的话,假如取值区间是1-4,就不会有4加入到数组里。
这道题虽然不难,还是很重要,需要多做几遍。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(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);
backtracking(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
};
这道题是可以进行优化的,在Carl的下个视频里讲了这么优化(或者叫剪枝),就是把for loop里的range做了限制。从i<=n改成了i <= n - (k - path.size()) + 1,因为在某些情况下,没有可选的数了,就没必要再继续运行了。