代码随想录算法训练营第24天|77. 组合
77. 组合
题目链接:77. 组合,难度:中等
【实现代码】
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
public:
void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.push_back(path);
return ;
}
//这是一个剪枝的操作
//for (int i = startIndex; i <= (n - (k - path.size()) + 1); i++) {
for (int i = startIndex; i <= n; i++) {
path.push_back(i);
backtracking(n, k, i + 1);
path.pop_back();
}
return ;
}
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};
【解题思路】
采用回溯算法解决组合(切割、子集、排列和棋盘)问题。
回溯三部曲:
- 确定返回值和参数:返回值一般为void,参数是先写逻辑,需要什么就写什么,这里是需要数组也就是n;组合的大小k;还有开始记录的索引,为了防止出现重复的组合
- 确定结束条件:对于这一题来说是当一个组合的大小为k时,就返回,并且先记录组合的结果
- 单层搜索的过程:(处理节点)for循环每次从startIndex开始遍历,然后用path保存取到的节点i;backtracking的下面部分就是回溯的操作了,撤销本次处理的结果。