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

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.xdnf.cn/news/19060.html

相关文章:

  • 服务器类型与TCP并发服务器构建(SELECT)
  • 设计模式:桥接模式(Bridge Pattern)
  • 《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 7】【使用buildroot方式构建文件系统】
  • 【开发便利】让远程Linux服务器能够访问内网git仓库
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 深入解析 Flink Function
  • Vue将内容生成为二维码,并将所有二维码下载为图片,同时支持批量下载(下载为ZIP),含解决一次性生成过多时页面崩溃解决办法
  • TCP 并发服务器构建
  • 智芯MCU 勘误文档问题解析
  • 【Java知识】Java线程相关对象全面解析与最佳实践
  • 阿里云——应用交付与负载均衡
  • 数据对话的“通用语法”:SQL与KingbaseES的智能处理艺术
  • 从感知机到大模型:神经网络的全景解析与实践指南
  • ES01-环境安装
  • 盛大启幕!融智兴科技亮相 IOTE 2025 深圳国际物联网展
  • SegEarth-R1: Geospatial Pixel Reasoning via Large Language Model
  • 稀土:从“稀有”到“命脉”的科技核心
  • LeetCode算法日记 - Day 23: 外观数列、数青蛙
  • LeetCode - 155. 最小栈
  • 8.28 模拟
  • rust语言(1.88.0)sqlite数据库rusqlite库(0.37.0)学习笔记
  • 蘑兔音乐:帮你把灵感落地
  • 【新版发布】Apache DolphinScheduler 3.3.1 正式上线:更稳、更快、更安全!
  • 【Django + Pure Admin】基于Django+Vue3的前后端分离管理系统框架设计
  • 预处理详解
  • 【Spring Cloud 微服务】5.架构的智慧枢纽:深度剖析 Nacos 注册中心
  • 《Vuejs设计与实现》第 17 章(编译优化)
  • JMeter 5.3 性能测试:文件下载脚本编写与导出文件接收完整指南
  • 数据结构:堆排序 (Heap Sort)
  • spire.doc在word中生成公式