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

代码随想录刷题Day49

回溯基本做题理论

  • 回溯本质是穷举,顶多在穷举过程中剪枝
  • 解决排列组合类问题
  • 回溯,可以具象化为树从叶子节点往根节点方向“回去”的过程
  • 回溯三部曲:
    • 返回值(void)和参数
    • 终止条件,达到条件则存放结果并return
    • 回溯搜索的遍历过程
      • 横向:for循环
      • 纵向:递归
  • void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
    }
    

组合

回溯的方法,感觉还是有点难上手。我做这一道题,对于回溯三要素:

  • 最开始是不知道如何去有序地罗列所有情况,看了参考题解,原来是可以选定一个stratIndex来决定。这是回溯的参数确定方面
  • 回溯的终止条件是迭代的深度,也就是数组中数的个数,这个点差点想不到;
  • 回溯的执行逻辑,我自己也没有捋得很明白:
    • for循环执行本层的结果,那下一层结果如何通过递归来实现:原来递归执行下一层操作是基于当前层的,也就是下面代码中的m+1。
    • 以及回溯这个动作需要让数组也跟着pop_back()掉,这样执行完这一层之后,数组中的数目和进入函数前是保持一样的。
class Solution {
public:vector<int> v;//存放数组序列vector<vector<int>> ans;//存放最后的答案序列void backtrack(int n,int k ,int startIndex){//从[startIndex,n]中取一个数if(v.size()==k){//已经收集了k个数ans.push_back(v);return ;}for(int m = startIndex;m<=n;m++){//取了m这个值v.push_back(m);//下一层从[m+1,n]中取一个数backtrack(n,k,m+1);v.pop_back();}}vector<vector<int>> combine(int n, int k) {backtrack(n,k,1);return ans;}
};

回溯虽然有模板算法可以套用,但目前还是比较难自己直接想明白,后面多做题再总结吧。

对于该代码,进一步优化的话,剪枝,主要在循环遍历的时候,m不必循环到n,而是可以根据当前数组中已有数的个数来确定最大取到什么位置。

比如已知现在v还要取t个数就达到有k个数的要求,那么当前这一轮循环m就不用遍历到n,而是遍历到m-t,因为最极限的做法,剩下t个我取[n-t+1,n-t+2,...,n]这t个数的话,m在这样的情况下,应该是最大最大也就是取到n-t,m再往后取,就会出现v还要t个数达到k,但是不够t个数中取t个数。

用中的图解释如下:

代码改动在for循环处:

class Solution {
public:vector<int> v;vector<vector<int>> ans;void backtrack(int n,int k ,int startIndex){if(v.size()==k){ans.push_back(v);return ;}for(int m = startIndex;m<=n-k+v.size()+1;m++){//for循环处剪枝优化v.push_back(m);backtrack(n,k,m+1);v.pop_back();}}vector<vector<int>> combine(int n, int k) {backtrack(n,k,1);return ans;}
};
http://www.xdnf.cn/news/20189.html

相关文章:

  • house (ai)
  • 对话Michael Truell:23岁创立Cursor,与Github Copilot竞争
  • 【C++上岸】C++常见面试题目--算法篇(第十九期)
  • 2025年8月文章一览
  • 深度学习:自定义数据集处理、数据增强与最优模型管理
  • 数据旁路(Data Bypassing)是什么?
  • 安装3DS MAX 2026后,无法运行,提示缺少.net core的解决方案
  • 2025年数学建模国赛C题第二版本超详细解题思路
  • Qwen-agent 核心功能分析学习
  • 从零开始学无监督学习:图像混合与标签平滑技术详解,收藏不走丢
  • C++开发中的常用设计模式:深入解析与应用场景
  • javaweb基础第一天总结(HTML-CSS)
  • SpringBoot中 Gzip 压缩的两种开启方式:GeoJSON 瘦身实战
  • 基于网络原理——HTTP/HTTPS的Web服务搭建与核心技术实践
  • Ubuntu 使用 Samba 共享文件夹
  • 什么是CA根证书
  • Apache PDFBox 与 spire.pdf for java 使用记录
  • 软件架构师全方位工具图谱
  • Java全栈开发面试实战:从基础到高并发的深度解析
  • 【数学建模学习笔记】机器学习回归:决策树回归
  • 无人机信号防干扰技术难点分析
  • 企业白名单实现【使用拦截器】
  • 梯度爆炸问题:深度学习中的「链式核弹」与拆弹指南
  • 嵌入式学习 51单片机(3)
  • (自用)cmd常用命令自查文档
  • 大语言模型基础-Transformer之上下文
  • (计算机网络)TCP 粘包与拆包
  • STM32传感器模块编程实践(十五)DIY语音对话控制+满溢检测智能垃圾桶模型
  • Selenium 超时完全指南:pageLoadTimeout、implicitlyWait 和 scriptTimeout 的深度解析
  • NineData发布 Oracle 到 MySQL 双向实时复制,助力去 O 战略与数据回流