回溯+剪枝
每次看到这种题知道是回溯就是写不出来。。。好虐心,还得多总结
剪枝就是优化时间复杂度的
先把回溯写出来
回溯一般就是push dfsd递归 pop,放进去递归返回的时候pop
class Solution {
private :
void dfs(int n, int k, int index, vector<int>& path, vector<vector<int>>& res) {
if (path.size() == k) {
res.push_back(path);
return;
}
// 搜索起点的上界 + 接下来要选择的元素个数 - 1 = n
// 接下来要选择的元素个数 = k - path.size()
// 搜索起点的上界 = n - (k - path.size()) + 1
for (int i = index; i <= n - (k - path.size()) + 1; ++i) {
path.push_back(i);
dfs(n, k, i + 1, path, res);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
if (k <= 0 || n < k) {
return res;
}
vector<int> path;
dfs(n, k, 1, path, res);
return res;
}
};