代码随想录刷题03.07
回溯算法1
回溯理论简介
回溯算法与递归相关,是一种纯暴力搜索法。
适用于:1)组合问题:无序;
2)排列问题:有序;
3)子集问题;
4)切割问题(字符串);
5)棋盘问题;
理解回溯:抽象为一个N叉树涂图形结构来理解;
回溯算法的模板:
vector<……>path;//定义路径;
vector<vector<……>>result;//定义结果集;
void travel(参数){
if(终止条件){
收集结果;
return;
}
for(遍历集合元素)
{
单层搜索体:
处理节点;
递归函数;
回溯操作;
}
return;
}
LeetCode题目
解题思路
1.回溯三步骤:
1)确定过回溯/递归函数形参;
2)回溯终止条件;
3)单层搜索体,包括"节点处理+递归+回溯"三小步。
2.回溯与纯递归函数的不同之处:for循环的使用(即单层搜索体的传递方式不同,回溯更像是横向向下传递),每层递归函数中都嵌套一层for循环。
3.剪枝操作:在单层搜索体的for循环条件中缩小搜索范围,即更改i的范围。
代码过程
class Solution {
public:
vector<int>path;
vector<vector<int>>result;//规范化:全局变量放函数前
void travel(int n,int k,int index){
if(path.size()==k){
result.push_back(path);
return;
}
for(int i=index;i<=n;i++)
{
path.push_back(i);
travel(n,k,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> combine(int n, int k) {
int index=1;
travel(n,k,index);
return result;
}
};
文章介绍了回溯算法的概念,将其与递归关联,并指出它是一种暴力搜索方法,适用于组合、排列、子集等问题。回溯算法通过N叉树的抽象来理解,提供了通用的算法模板。文章以LeetCode的77题“组合”为例,详细解释了回溯算法的解决思路,包括回溯的三步骤和剪枝操作,并展示了具体的C++代码实现。

888

被折叠的 条评论
为什么被折叠?



