回溯法理论基础
思路分析:
代码实现:
Leetcode 77. 组合
思路分析:
本题可通过多层for循环,暴力求解出k个数的组合,但如果数据很多且k值较大时,实现难度非常大。此类问题常用回溯法处理。
可定义result表示满足k个数的组合的集合,定义path_result表示满足k个数的组合;用for循环横向遍历,用递归法纵向遍历,当path_result的元素个数等于k时,即找到了一个组合,将该组合存放到result集合中。result结果便是此题结果。
代码实现:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
vector<int> path_result;
result.clear();
path_result.clear();
if (n < k)
return result;
backtracking(n, k, 1, result, path_result);
return result;
}
private:
void backtracking(int n, int k, int startIndex, vector<vector<int>>& res, vector<int>& path) {
if (path.size() == k) {
res.push_back(path);
return;
}
for (int i = startIndex; i <= n; i++) {
path.push_back(i);
backtracking(n, k, i + 1, res, path); // 注意要用i+1,不能用startIndex+1
path.pop_back();
}
}
};