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

第七章 回溯算法part01

2026.03.15 02.23 第二十七天

77 组合

回溯比二叉树还要抽象~

要弄懂startIndex和i分别代表了什么。

递归法:

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startIndex) {if(path.size() == k) {result.push_back(path);return;}for(int i = startIndex; i <= n; i++) {path.push_back(i);backtracking(n, k, i + 1);path.pop_back();}}public:vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

进行剪枝,去掉不必要的搜索:

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startIndex) {if(path.size() == k) {result.push_back(path);return;}for(int i = startIndex; i <= n - (k - path.size()) + 1; i++) {path.push_back(i);backtracking(n, k, i + 1);path.pop_back();}}public:vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

216 组合综合|||

在上一题的基础上改动即可,剪枝操作需要进行修改,剪枝逻辑是当目前的总和已经大于目标值sum时,立即停止查找。

递归法:

class Solution {
private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果void backtracking(int targetSum, int k, int sum, int startIndex) {if (sum > targetSum) { // 剪枝操作return; }if (path.size() == k) {if (sum == targetSum) result.push_back(path);return; // 如果path.size() == k 但sum != targetSum 直接返回}for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝sum += i; // 处理path.push_back(i); // 处理backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯}}public:vector<vector<int>> combinationSum3(int k, int n) {result.clear(); // 可以不加path.clear();   // 可以不加backtracking(n, k, 0, 1);return result;}
};

17 电话号码的字母组合

涉及字符映射,有点麻烦。

这题是排列,需要遍历所有可能,所以不需要进行剪枝。

递归法:

class Solution {
private:const string letterMap[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz",};vector<string> result;string s;void backtracking(const string& digits, int index) {if(index == digits.size()) {result.push_back(s);return;}int num = digits[index] - '0';string str = letterMap[num];for(int i = 0; i < str.size(); i++) {s.push_back(str[i]);backtracking(digits, index + 1);s.pop_back();}}public:vector<string> letterCombinations(string digits) {backtracking(digits, 0);return result;}
};
http://www.jsqmd.com/news/482154/

相关文章:

  • 数字员工和AI销冠系统是什么?它们在企业智能化运营中的优势与应用是什么?
  • 基于线性准则的考虑风力发电不确定性的分布鲁棒优化机组组合附Matlab代码
  • 公共数据资源挖掘:TCGA、GEO、ENCODE、GTEx——如何利用公开数据开展二次研究?
  • “土木人转行软件测试学习第10天”-流程管理平台(JIRA)
  • 2026年3月亲子西双版纳住宿推荐,这些地方值得一住!目前排行前列的西双版纳住宿源头厂家有哪些聚焦优质品牌综合实力排行 - 品牌推荐师
  • 本月刮板输送机产品排名,看看哪些表现突出,排行前列的刮板输送机排行综合实力与口碑权威评选 - 品牌推荐师
  • 微信JS-SDK分享权限验证失败?“offline verifying”错误排查全攻略
  • 速看!2026年3月刮板输送机优质产品排行榜,市面上头部刮板输送机厂商优质品牌榜单更新 - 品牌推荐师
  • 文件头标识
  • 2026年3月国内口碑好的皮带输送机生产厂家排行榜大揭秘,皮带输送机生产厂家关键技术和产品信息全方位测评 - 品牌推荐师
  • Gradle 与 React Native:跨平台移动开发的构建指南
  • 【电力系统】新能源出力不确定性的电气设备综合能源系统协同优化【含Matlab源码 15175期】
  • 微短剧《嘉庆君游台湾》开机 演员余玥演绎进阶版菊香
  • 详解DeepSeek残差链接mHC进化之路
  • BookRAG:面向层级文档的树-图融合RAG框架
  • 2026年国内这些口碑好的皮带输送机生产厂家上榜啦,目前皮带输送机企业哪个好精选优质品牌解析 - 品牌推荐师
  • 2026年口碑聚焦:皮带输送机生产厂家实力大盘点,皮带输送机公司排行榜技术领航者深度解析 - 品牌推荐师
  • 用STM32+LAN9252实现etherCAT 从站IO控制
  • 617.合并二叉树-day18
  • 使用GIMP去除水印的有效方法
  • 洛谷题单指南-基础线性代数-P2151 [SDOI2009] HH 去散步
  • 洛洛电竞三角洲代肝(招人)
  • 为什么很多医院(尤其中医院)卖药 —— 院内挂网、院外卖药
  • go 语言之map
  • Pipelined-SAR ADC全流程设计:从理论到实践
  • 20260314 模拟测 总结
  • 1022: 淘金
  • ICPC2025四川省赛题解
  • 701. 二叉搜索树中的插入操作-day18
  • java6