当前位置: 首页 > news >正文

【高频考点】回溯(暴力搜索)

目录

回溯的目标:是要返回所有符合条件的结果的集合(暴力搜索)

回溯的遍历(类似树的遍历):

​编辑回溯三部曲

1递归函数的返回值以及参数

2回溯函数终止条件

3单层搜索的过程

经典问题

组合问题:N个数里面按一定规则找出k个数的集合

切割问题:一个字符串按一定规则有几种切割方式 abcdef

子集问题:一个N个数的集合里有多少符合条件的子集

排列问题:N个数按一定规则全排列,有几种排列方式

棋盘问题:N皇后,解数独等等


回溯的目标:是要返回所有符合条件的结果的集合(暴力搜索)

回溯的遍历(类似树的遍历):

for循环-横向遍历-集合大小(树的宽度)

递归-纵向遍历-树的深度

回溯三部曲

1递归函数的返回值以及参数

2回溯函数终止条件

3单层搜索的过程

经典模板:

void backtracking(参数) { if (终止条件) { 存放结果; return; } ​ for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; //处理 backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 //还原现场 } }

解题技巧:返回值一般是void;先写逻辑再填参数

经典问题

  • 组合问题:N个数里面按一定规则找出k个数的集合

    1)写出集合数组 是[1,2,3,...,n];画出树结构

    2)写回溯函数:①终止条件:长度为k时,加到结果里并返回

    ②遍历:for范围是集合中元素的个数;

    递归的索引是从当前的下一个元素开始(因组合无序)

    3)组合数是无序的(用过的不能再用):因此for遍历起始值是当前元素的idx,递归的索引是从当前的下一个元素开始

    *如果是多个集合取组合,各个集合之间相互不影响,那么就不用idx

    *如果元素是可重复选取的,递归的i的idx不需要+1

    *如果集合中元素有重复,但只能用集合中的,就需要用used标记/idx去重;还要先排序sort(candidates.begin(), candidates.end()); 操作的时候加判断是否与上个数字重复

    4)定义全局变量:结果数组和中间结果数组

    class Solution { vector<vector<int>> result;// 存放符合条件结果的集合 vector<int> temp;// 用来存放符合条件结果 public: void backtracking(vector<int> nums, int n, int k,int idx){ if(temp.size()==k){ result.push_back(temp); return; } for(int i=idx;i<n;i++){//剪枝优化 i<n-(k-temp.size())+1 temp.push_back(nums[i]); backtracking(nums,n,k,i+1); temp.pop_back(); } } vector<vector<int>> combine(int n, int k) { vector<int> nums; for(int i=0;i<n;i++){ nums.push_back(i+1); } backtracking(nums,n,k,0); return result; } };

    优化:如果for循环选择的起始位置之后的元素个数已经不足我们需要的元素个数了,那么就没有必要搜索了

  • 切割问题:一个字符串按一定规则有几种切割方式 abcdef

    -选取一个a之后,在bcdef中再去选取第2个,选取b之后在cdef中再选取第3个。

    -切割一个a之后,在bcdef中再去切割第2段,切割b之后在cdef中再切割第3段。

    // 获取[startIndex,i]在s中的子串 string str = s.substr(startIndex, i - startIndex + 1);
  • 子集问题:一个N个数的集合里有多少符合条件的子集

    相当于没有终止条件的组合,是统计所有节点(组合是统计所有叶子节点)

  • 排列问题:N个数按一定规则全排列,有几种排列方式

    每层都是从0开始搜索而不是startIndex

    需要used数组记录temp里都放了哪些元素了

  • 棋盘问题:N皇后,解数独等等

http://www.gsyq.cn/news/1465595.html

相关文章:

  • 新手避坑指南:用JDBC连接MySQL数据库时,为什么你的PreparedStatement总报错?
  • 树枝粉碎机选型算法:基于场景与物料的博尚机型匹配指南 - 会飞的懒猪
  • 混合整数线性规划(MILP)实战入门:从排班优化到业务决策建模
  • 2026实测|5款在线协作白板横评,告别选型纠结
  • 会议平板哪家好:排名前五专业深度测评 - 服务品牌热点
  • 金仓V8数据库Win10安装后服务不见了?别慌,用这个工具一键搞定服务注册
  • Hotkey Detective:三步快速定位Windows热键冲突的终极解决方案
  • TI的TPS5430补偿网络设计实战:用Webench工具5分钟搞定相位裕度
  • 不止于建模:用Matlab Robotic Toolbox玩转机械臂轨迹规划与动画演示
  • ARGEN:单细胞因果基因网络重建方法解析
  • 考研数学二多元函数微分学保姆级攻略:从偏导数到拉格朗日乘数法,手把手带你搞定同济高数下册第九章
  • STM32基础(2)
  • 2026粤靠谱全屋定制评测:欧雅尊领衔 - 服务品牌热点
  • 从监控模式到数据解析:手把手教你用tcpdump和iw命令搭建无线信号监测环境(避坑指南)
  • 5G网络优化实操:手把手教你理解CORESET的交织与非交织映射(附实例图解)
  • VASP计算实战:从Fe/石墨烯体系INCAR文件,深入理解磁各向异性(MAE)的每个参数
  • 安卓手机直接解包微信.dat缓存文件,支持图片还原和多格式识别,附源码与APK
  • AI工具与智能过滤整合最佳实践(企业级部署白皮书·2024Q3最新版)
  • 信息学奥赛刷题避坑指南:从‘单词翻转’看字符串输入的常见陷阱与调试技巧
  • 碧蓝航线自动化终极指南:Alas脚本让游戏管理变得如此简单
  • Linux安装miniconda
  • Sqribble深度解析:云原生模板化PDF出版流水线
  • 【AI培训革命性整合指南】:20年IT专家亲授5大落地场景与避坑清单
  • DSP28335硬件SPI实战:不用FIFO,如何精准控制8位数据的收发时序?
  • TVA存量项目升级改造(一):低成本改造!传统OpenCV项目一键升级为TVA智能体方案
  • ArcGIS Pro新手避坑:用矢量shp裁剪TIF影像,为啥我的结果总带个‘黑边’矩形?
  • 告别requests的ConnectionError:一份涵盖SSL验证、代理设置与连接管理的避坑指南
  • 别再傻傻分不清YUV和YCbCr了!搞音视频开发必懂的色彩编码基础
  • Chromatic:发现Chromium/V8通用修改器的3大独特优势
  • LVM逻辑卷超全实战——创建、扩容、缩容、原理详解