77. 组合 - 力扣(LeetCode) (leetcode-cn.com)
组合
模板
void backTracking(...) {
if (到达边界) {
保存结果;
返回;
}
for (本层处理逻辑) {
保存本次处理数;
backTracking();
回溯;
}
}
- DFS
- 回溯
- 剪枝
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
void DFS(int n, int k, int index) {
if (path.size() == k) {
ans.emplace_back(path);
return;
}
// 剪枝在于什么时候没得选, 整个for循环目的就是在做选择
// 比如我们要拿4个球 但只有3个球,那么剩下的情况再考虑就是浪费时间了
// 现在我要拿 k - path.size()个球, 现在有 n - i + 1个球
// 要保证 k - path.size() <= n - i + 1
for (int i = index; k - path.size() <= n - i + 1; ++i) {
path.emplace_back(i);
DFS(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
DFS(n, k, 1);
return ans;
}
};