视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0077.组合.html#思路
力扣题目:https://leetcode.cn/problems/combinations/submissions/656261390/
主要思路如图所示:
对于回溯算法我们可以将其抽象为树的结构,主要思路如下:
- 返回值以及参数
- 回溯终止条件
- 单层回溯
cpp
class Solution {
private:
//存放结果数组
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();
}
}
public:
vector<vector<int>> combine(int n, int k) {
result.clear();
path.clear();
backtracking(n, k, 1);
return result;
}
};