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

day22 回溯算法part01

理论基础

递推本质上也是暴力求解

回溯模版框架

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

什么样的场景时候递推

  • 需要for循环的个数是不定的,可能越来越多,导致暴力写法都没法写

组合

第77题. 组合

力扣题目链接(opens new window)

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

77.组合1

class Solution {
public: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++){  // 保证后面的还够k个path.push_back(i);backtracking(n, k, i + 1);path.pop_back();}}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

组合总和III

216.组合总和III

力扣题目链接(opens new window)

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

class Solution {
public:vector<vector<int>> result;vector<int> path;int sum;void backtracking(int targetSum, int k, int startIndex){// n=9固定if (targetSum < 0) return;  // 剪枝操作if (path.size() == k && targetSum == 0){  // 返回条件result.push_back(path);return;}for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++){path.push_back(i);targetSum -= i;backtracking(targetSum, k, i+1);path.pop_back();targetSum += i;}} vector<vector<int>> combinationSum3(int k, int n) {backtracking(n, k, 1);return result;}
};

电话号码的字母组合

17.电话号码的字母组合

力扣题目链接(opens new window)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母

class Solution {
public:const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};vector<string> result;string s;void backtracking(const string & digits, int index){  // index是指每个数字比如"23"中的"2"和"3"if (index == digits.size()){result.push_back(s);return;}int digit = digits[index] - '0';  // int(digits[index]) 会把字符转换成 ASCII 码值string letters = letterMap[digit];for (int i = 0; i < letters.size(); i++){ // 每一个数字代表的是不同集合s.push_back(letters[i]);backtracking(digits, index+1);s.pop_back();} }
http://www.dtcms.com/a/353669.html

相关文章:

  • Day6--HOT100--238. 除自身以外数组的乘积,41. 缺失的第一个正数,73. 矩阵置零
  • 前端漏洞(下)- ClickJacking漏洞
  • 指针 (六):sizeof和strlen细节强化之“做题篇”
  • stl--std::map
  • Java 使用Jna 调用 C# dll文件踩到的坑
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 【Linux 小实战】自定义 Shell 的编写
  • LCD 上显示字符
  • zookeeper-集群扩缩容
  • 稳敏双态融合架构--架构师的练就
  • banner这个文件是怎么请求到后端数据的
  • Rust:引用
  • Vue-24-利用Vue3的element-plus库实现树形结构数据展示
  • Autodesk Maya 2026.2 全新功能详解:MotionMaker AI 动画、LookdevX 材质增强、USD 工作流优化
  • 在MiniOB源码中学习使用Flex与Bison解析SQL语句-第二节
  • 【Linux】正则表达式学习记录
  • FFMPEG api使用
  • 从disable_cost到disabled_nodes,最小代价预估质的飞跃
  • nestjs日志(nest-winston)
  • pyecharts可视化图表-tree:从入门到精通
  • Linux 系统调优与CPU-IO-网络内核参数调优
  • Task04: CAMEL框架中的多智能体系统(课程第三章剩余章节)
  • 大模型安全概述、LlamaFirewall
  • ESP8266:Arduino学习
  • 前端性能优化:从指标监控到全链路落地(2024最新实战指南)
  • 短视频矩阵管理软件推荐——小麦矩阵系统深度解析
  • 关于两视图相机几何关系
  • DevExpress WPF中文教程:如何将WPF数据网格绑定到本地集合?
  • 软件定义汽车(SDV)调试——如何做到 适配软件定义汽车(SDV)?(下)
  • vue新能源汽车销售平台的设计与实现(代码+数据库+LW)