回溯法及其经典例题

回溯到底是个什么东西(含有大量经典例题加详细分析) 
 用最通俗的话解释回溯思想::盆友,玩过联盟吗?:没有啊,好玩吗?:好玩啊,你试试:mmp,试过了,不好玩,还是吃鸡去,吃鸡使我快乐你的目的是快乐,发现打联盟不能使你快乐,马上找另外一条能使你快乐的路------------------------------(一条很正经的分割线)-------------------------------------------... 阅读详情

引言:

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

链接:https://leetcode-cn.com/tag/backtracking/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

回溯法和DFS的联系和区别:

联系:
看到上面的回溯算法的基本思想你可能会想,回溯算法和深度优先搜索有什么区别和联系呢?其实
回溯法通常和深度优先搜索相联系,如果当前的路径走不通时,就后退一步,然后继续走(这和深度优先搜索DFS)相似。其实回溯法通常会借助DFS来求解,回溯搜索就是深度优先搜索(DFS)的一种。对于某一个搜索树来说(搜索树是起记录路径和状态判断的作用),回溯和DFS,其主要的区别是,回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树。为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。
区别:
深度优先遍历:已经访问过的节点不再访问,所有点仅访问一次。
回溯法:已经访问过的点可能再次访问,也可能存在没有被访问过的点。
(区别不止这一个,只不过这个比较有象征性)

经典例题1:二叉树中和为某一值的路径

题目链接
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
在这里插入图片描述

题解:

首先要用一个向量来记载走的路径,从根节点向下走,如果到达叶子节点,并且路径和等于目标值时,就把该路径记录到一个二维向量中。如果到达叶子节点但是路径和不等于目标值时,那么就向上回溯。本来递归左右子树就是要向上回溯,这时当一个节点的左右子树都被遍历过,那么就把路径记录值弹出来,让路径的记录值也同时向上回溯,然后遍历完所有节点即可得到该题的解。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void help(TreeNode* root,int sum)
    {
        if(root==NULL)
        {
            return ;
        }
        sum-=root->val;
        path.push_back(root->val);
        if(!root->left&&!root->right&&sum==0)
        {
            vector<int> temp;
            for(int i=0;i<path.size();i++)
            {
                temp.push_back(path[i]);
            }
            res.push_back(temp);
        }
        help(root->left,sum);
        help(root->right,sum);
        path.pop_back();//路径回溯
    }
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        help(root,sum);
        return res;
    }
};

经典例题2:组合总和

题目链接
**题目描述:**给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
输入输出:
在这里插入图片描述

题解:

从前(下标为m处)往后遍历向量candidates,只要当前的值小于或等于target-sum,就把该数字存入路径向量temp中,如果当前的值大于target-sum,就继续往后遍历,遍历完整个数组,就回溯,把路径向量弹出最后面的,然后从再从下标为n+1处遍历数组,(如果当前的sum值等于目标target值,就把当前的路径保存起来)直到从每一个下标开始的情况都考虑完,那么问题的解就求出来了。

代码:

class Solution {
public:
    void help(vector<int> candidates,int target,vector<vector<int>> &res,vector<int> &temp,int sum,int m)
    {
        if(sum==target)
        {
            res.push_back(temp);
        }
        else
        {
            for(int i=m;i<candidates.size();i++)
            {
                if(sum+candidates[i]<=target)
                {
                    temp.push_back(candidates[i]);
                    help(candidates,target,res,temp,sum+candidates[i],i);
                    temp.pop_back();
                }
            }
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        vector<int> temp;
        help(candidates,target,res,temp,0,0);
        return res;
    }
};

经典例题3:组合总和3

题目链接
**题目描述:**找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
输入输出
在这里插入图片描述

题解:

从1开始遍历,如果当前的sum<n,并且保存的数的个数小于k,那么就保存当前数,继续向后遍历。如果当前sum==n并且保存的数的个数正好等于k,那么就把此路径保存。如果当前sum已经大于n,那么就可以返回了。

代码:

class Solution {
public:
    void help(int k,int n,vector<vector<int>> &res,vector<int> &ve,int sum,int start)
    {
        if(sum==n&&ve.size()==k)
        {
            res.push_back(ve);
        }
        for(int i=start;i<=9;i++)
        {
            if(sum<n&&ve.size()<k)
            {
                ve.push_back(i);
                help(k,n,res,ve,sum+i,i+1);
                ve.pop_back();//回溯
            }
            else if(sum>n)  return ;
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> res;
        vector<int> ve;
        help(k,n,res,ve,0,1);
        return res;
    }
};
五大算法思想(三)回溯法及常见例子 五大算法思想 回溯法 八皇后问题、装载问题、批量作业调度问题、背包问题 阅读详情

相关推荐

算法竞赛入门经典经典例题及习题题解

Github仓库 有些例题没找到完全相同的题目,找了类似的。 文章目录算法竞赛入门经典第一版第5章 基础题目选解5.1 字符串5.2 高精度计算5.3 排序与检索5.4 数学基础第六章 数据结构基础6.1 栈和队列6.2 链表6.3 二叉树6.4 图第七章 暴力求解法7.1 简单枚举7.2 枚举排列7.3 子集生成7.4 回溯法7.5 隐式树的遍历第八章 高效算法设计8.1 算法初步分析8.2 再...

Utopiabuntu的博客 3959

回溯算法(例题详细解析)

回溯算法(例题详细解析)涉及到深度优先、广度优先遍历进行回溯,深度解析,详细了解回溯算法

c_study__c的博客 6164

回溯法及其应用

参考链接: http://www.cnblogs.com/chinazhangjie/archive/2010/10/22/1858410.html http://baike.baidu.com/link?url=m-I1xz9PSYf9Hr8koWBcx2JNnHVCmKT_wA4L4ryrqHocN-I6oTp-pnEl9HB3FhhT8Gr2J50mG-aNRmF6K5QHbnO3_GdQOF

na_beginning的专栏 3361

回溯算法的四道经典题目,组合,子集,图着色和n皇后

信手拈来,加油!

m0_64583181的博客 852

搜索与回溯(深搜和广搜概念、定义、算法框架、及经典例题详讲加代码)

搜索与回溯搜索和回溯1、 概念1、深度搜索1、概念2、深度优先搜索的算法框架4、典型例题1、八皇后原始版本 搜索和回溯 1、 概念 搜索是计算机程序设计中一种最基本、最常用的算法。搜索算法是直接基于计算机高速运算的 特点而使用的计算机求解方法。 它是从问题的初始状态出发,根据其中的约束条件,按照一定的策略,有序推进,不断深入, 对于达到的所有目标状态(解空间),一一验证,找到符合条件的解(可行解...

qq_41741449的博客 4294

HPM6E00:PWM V2使用指南

HPM6E00:PWM V2使用指南

xikangsoon的博客 1734

回溯算法问题汇总

leetcode回溯算法问题汇总

范大的博客 800

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 474

回溯法基础:算法框架、基本思想

声明:以下部分内容整理自网络或书籍,如有侵权,请联系我删除相关内容 目录: 算法框架 回溯法的定义 解题步骤 基本思想 经典例题 0-1背包问题 旅行售货员问题 装载问题 最大团问题 批处理作业调度 n皇后问题 图的m着色问题 算法框架 回溯法的定义 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 系统性指能够全面搜索;跳跃性则是可以有目的性地提前筛选掉不合格的解 因此回溯法有“...

sc2333的博客 4448

上下文理解的AI增强方案:AI应用架构师的架构洞察

本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 220

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 221

LeetCode总结,回溯法小结

一,回溯法思想 回溯法概念       回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。    回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态

EbowTang的练习场 1万+

ABA分析方法 — 软硬件开发必备的一种分析问题绝佳套路

可能你从很多地方听过这个名词,无论是在软件开发还是硬件领域(比较典型的领域:汽车、消费电子、医疗等行业),ABA验证都是一种快速分析故障的一个方法,第一次听到这个词,当时是不是一脸懵逼,本文就深度带你了解下ABA的分析方法。简要概述就是:怀疑A模块导致系统故障,将B模块替换A模块,故障消失,再将A模块替换回来,故障复现,则说明A模块是导致系统故障的原因其实,ABA分析问题,可能很多人在工作中都或多或少用过这个方法,只是没有这个概念,说明白了就是控制变量和对比验证,没什么高大上的东西。

Eureka1024的博客 7343

【数据结构与算法-递归、回溯、分治策略面试经典例题汇总】

【数据结构与算法-经典例题汇总】典例1、链表逆序-a(easy)典例2、链表逆序-a(easy)典例3、链表逆序-a(easy)典例4、链表逆序-a(easy)典例5、链表逆序-a(easy)典例6、链表逆序-a(easy)典例1、链表逆序-a(easy) 【数据结构与算法-经典例题汇总】典例1、链表逆序-a(easy)典例2、链表逆序-a(easy)典例3、链表逆序-a(easy)典例4、链表逆序-a(easy)典例5、链表逆序-a(easy)典例6、链表逆序-a(easy)典例1、链表逆序-a(easy

是小武呀 1518

基于Simulink的双PMSM差速驱动转矩同步控制建模示例

本文详细介绍了基于Simulink的双永磁同步电机(PMSM)差速驱动转矩同步控制建模方法。针对AGV/叉车等双电机独立驱动系统的转矩不同步问题,提出主从式+交叉耦合控制策略,在Simulink中实现直线行驶、90°转弯和单轮打滑恢复三种工况的仿真验证。通过动力学建模、参数差异设置、同步误差定义及控制律设计,最终实现同步误差<3%、转弯半径跟踪误差<5%、打滑后100ms内恢复的性能指标。文章特别强调了实际工程中的参数标定、通信同步和故障处理要点,并提供了完整的Simulink建模步骤和工具箱使

xiaoheshang_123的博客 205

如何解除Uniaccess管控??

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2391

回溯算法递归调用过程解析

解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题: 1、路径:也就是已经做出的选择。 2、选择列表:也就是你当前可以做的选择。 3、结束条件:也就是到达决策树底层,无法再做选择的条件。 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列

qq_40637903的博客 1805

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 157

算法篇——回溯法

写在前面:        回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。当我们在某一步选择了其中一个选项时,就进入下一步,然后又面临新的选项。我们就这样重复选择,直至达到最终的状态。        通常回溯法算法适合用递归实现代码。当我们到达某...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 794

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

回溯法经典例题

今天伟帅讲了两个回溯法的经典例题,还比较容易理解,记录一下吧~ 回溯法 (有点崇拜的一种方法,就是会用就感觉很轻松,没有想到就……) N皇后问题 题目:使用回溯法求解N后问题 输入:皇后的个数 输出:每一种方案 案例: 思路:从第1行开始安排皇后的位置,如果皇后没安排完就没有合适的位置了,就回退! AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; int n; int m[101],l[101]

qq_46563304的博客 2997

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

五大常用算法之回溯法详解及经典例题

一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。 基本思想类同于: 图的深度优先搜索 二叉树的后序遍历 【 分支限界法:广度优先搜索 思想类同于:图的广度优先遍历 ...

m0_49199459的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

五大经典算法之回溯法及其应用

前言 回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”,这就是回溯法的定义;这个和穷举法有些关联,都在不断的试探;而下面从从九宫格、八皇后、数独问题、来理解回溯法 回溯法的应用 九宫格问题 我们要将4或者9个数或者16个数 n的n次方个数放入九宫格中,使得所有斜线和直线的数相加都等于相同的值,怎么解决这个问题;这就...

踩踩踩从踩的博客 2476

回溯法(以DFS为例)例题总结

回溯法(以DFS为例)例题总结 框架: #定义一个结果数组 self.result = [] def dfs(candidates,res): #满足题目,返回条件 if target==sum(res): self.result.append(res[:]) for i in range(len(candidates)): #临时结果添加

justsolow的博客 532

回溯法的经典例题

本文是 《算法题目解析系列》 的第 [35] 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。

2501_92769340的博客 217

经典算法之回溯法

一、概述 回溯法思路的简单描述:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。 回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。 (1)如果不可行,则跳过对该节点为根的子树的搜...

Fighting_初心的博客 1245
上一篇: 分治法及经典例题
下一篇: 圆和矩形是否有重叠
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值