当前位置: 首页 > 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.jsqmd.com/news/953976/

相关文章:

  • 2026年最新包头市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • 2026年最新石家庄口碑好的高中选择指南:核心维度逐一拆解 - 奔跑123
  • ESP8266 NON-OS SDK外设驱动实战包:含AT固件、多容量链接脚本与全版本启动镜像
  • 新手避坑指南:用JDBC连接MySQL数据库时,为什么你的PreparedStatement总报错?
  • 南京区域 GEO 优化落地周期与 AI 收录规律详解(豆包、DeepSeek 适配指南)
  • 缓存技术:从CPU Cache到AI KV Cache (四)Web缓存
  • 2026年无人机维修培训及合肥加盟推荐测评 - 服务品牌热点
  • 专为Agent使用的磁盘清理脚本
  • 树枝粉碎机选型算法:基于场景与物料的博尚机型匹配指南 - 会飞的懒猪
  • 2026年最新宝鸡市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • 2026实测|5款在线协作白板横评,告别选型纠结
  • Flutter国内镜像又挂了?别慌,手把手教你快速切换到清华/腾讯云镜像(附最新可用地址)
  • 2026年|逆向破解维普新版查重!论文AIGC率高怎么降?5款实测工具+4招手改底层逻辑 - 降AI实验室
  • 星辰变归来手游官网下载:2026年6月官方下载渠道(最新正版、优先推荐)
  • 不只是点灯:用Quartus II 13.1 + USB-Blaster完成你的第一个FPGA工程(从新建到下载)
  • 模板驱动型文档自动化:结构化生成高质量PDF方案
  • 全源码提供-高效省钱的社区团购小程序
  • Sqribble:轻量级文档操作系统与自动化排版原理
  • 会议平板哪家好:排名前五专业深度测评 - 服务品牌热点
  • 金仓V8数据库Win10安装后服务不见了?别慌,用这个工具一键搞定服务注册
  • IDEA配置 Custom VM options
  • Hotkey Detective:三步快速定位Windows热键冲突的终极解决方案
  • TI的TPS5430补偿网络设计实战:用Webench工具5分钟搞定相位裕度
  • 不止于建模:用Matlab Robotic Toolbox玩转机械臂轨迹规划与动画演示
  • 加权NP难题的高效算法:小倍增权重下的突破
  • 2024广州黄埔民办学校排名:零基础家长择校避坑指南 - 服务品牌热点
  • Java 异常分类
  • 考研数学二多元函数微分学保姆级攻略:从偏导数到拉格朗日乘数法,手把手带你搞定同济高数下册第九章
  • ARGEN:单细胞因果基因网络重建方法解析
  • 企业级智能知识库架构设计与全栈AI文档处理系统实现指南