代码随想录算法训练营第二十四天|1.回溯理论简介、77. 组合

文章介绍了回溯算法的概念,将其与递归关联,并指出它是一种暴力搜索方法,适用于组合、排列、子集等问题。回溯算法通过N叉树的抽象来理解,提供了通用的算法模板。文章以LeetCode的77题“组合”为例,详细解释了回溯算法的解决思路,包括回溯的三步骤和剪枝操作,并展示了具体的C++代码实现。

代码随想录刷题03.07

回溯算法1

回溯理论简介

回溯算法与递归相关,是一种纯暴力搜索法。

适用于:1)组合问题:无序;

​ 2)排列问题:有序;

​ 3)子集问题;

​ 4)切割问题(字符串);

​ 5)棋盘问题;

理解回溯:抽象为一个N叉树涂图形结构来理解;

回溯算法的模板:

vector<……>path;//定义路径;
vector<vector<……>>result;//定义结果集;
void travel(参数){
if(终止条件){
收集结果;
return;
}
for(遍历集合元素)
{
单层搜索体:
    处理节点;
    递归函数;
    回溯操作;
}
return;
}

LeetCode题目

77. 组合

解题思路

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值