回溯算法 ----- 第2天

【算法思想:回溯法】回溯算法入门级详解 回溯算法与深度优先遍历 以下是维基百科中「回溯算法」和「深度优先遍历」的定义。 回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况: 找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。 深度优先搜索 算法(英语:Depth-Fir 阅读详情

今日内容:

  • 216.组合总和III

  • 17.电话号码的字母组合


组合总和III

 

 本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。

回溯三部曲

1、确定递归函数参数

vector<vector<int>> result;//最后的结果
vector<int> path;//保存每个可能的结果

void backtracking(int targetSum, int k, int Sum, int startIndex)

targetSum:目标和,题目中的n;

k:题目中的要求

Sum:当前路径的和,path里的元素的和

startIndex:为下一层for循环的起始位置

2、终止条件

if(path.size() == k)
{
    if(Sum == targetSum)
    {
        result.push_back(path);
        return;
    }
}

这个其实很好理解,首先满足k个数,然后再满足这个k个数的和符合n,这样就可以放到result。

回溯搜索的遍历过程

for(int i = startIndex; i <= 9; i++)
{
    sum += i;
    path.push_back(i);
    backtracking(targetSum, k, Sum, i + 1);
    sum -= i;
    path.pop_back(i);
}

所以如下代码

class Solution {
private:
    vector<vector<int>> result; // 存放结果集
    vector<int> path; // 符合条件的结果
    // targetSum:目标和,也就是题目中的n。
    // k:题目中要求k个数的集合。
    // sum:已经收集的元素的总和,也就是path里元素的总和。
    // startIndex:下一层for循环搜索的起始位置。
    void backtracking(int targetSum, int k, int sum, int startIndex) {
        if (path.size() == k) {
            if (sum == targetSum) result.push_back(path);
            return; // 如果path.size() == k 但sum != targetSum 直接返回
        }
        for (int i = startIndex; i <= 9; i++) {
            sum += i; // 处理
            path.push_back(i); // 处理
            backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex
            sum -= 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.电话号码的字母组合

 

理解本题后,要解决如下三个问题:

  1. 数字和字母如何映射
  2. 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来
  3. 输入1 * #按键等等异常情况

我们可以用一个map做映射

const string letterMap[10] = {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
};

回溯算法解决遍历问题

回溯三部曲

1、确定递归函数的参数 

vector<string> result;
string s;

void backtracking(const string& digits, int index);
//digits为我们想要的字母组合对应的字数 "23"
//index就是上一个题目的startIndex,这个index是记录遍历第几个数字了,
//就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。

这个index的理解就是遍历digits这个字符串,当index为digits的大小的时候说明就遍历结束了。

2、确定终止条件

就和上面说的一样

if(index == digits.size())
{
    result.push_back(s);
    return;
}

3、遍历逻辑

void backtracking(const string& digits, int index)
{
    int digit = digits[index] - '0';//比如digits = '23',index = 0,那么digit = 0开始

    string letters = letterMap[digit];//digits[2]对应的字母"abc"
    for(int i = 0; i < letters.size(); i++)
    {
        s.push_back(letters[i];
        backtracking(digits, index + 1);
        s.pop_back();
    }
}

最后的代码

class Solution {
private:
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
public:
    vector<string> result;
    string s;
    void backtracking(const string& digits, int index) {
        if (index == digits.size()) {
            result.push_back(s);
            return;
        }
        int digit = digits[index] - '0';        // 将index指向的数字转为int
        string letters = letterMap[digit];      // 取数字对应的字符集
        for (int i = 0; i < letters.size(); i++) {
            s.push_back(letters[i]);            // 处理
            backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了
            s.pop_back();                       // 回溯
        }
    }
    vector<string> letterCombinations(string digits) {
        s.clear();
        result.clear();
        if (digits.size() == 0) {
            return result;
        }
        backtracking(digits, 0);
        return result;
    }
};

[leetcode·回溯算法]回溯算法解题套路框架 回溯算法本质上就是遍历一颗多叉树:1、确定递归终止条件2、执行单层操作逻辑3、确定下一层递归所需的操作列表4、注意剪枝和代码优化。 阅读详情

相关推荐

LSF实践专题(15):LSF队列优先级以及抢占功能初探

在LSF暂停作业时,会向作业发送一个SIGTSTP信号,并且将作业状态变成SSUSP(system suspend),表示被系统暂停,这时,最好是作业的应用能够捕获和处理SIGTSTP信号,否则,即使在LSF中,作业会被认为暂停了,并且释放了slots资源,但是在实际OS中,作业进程仍然在继续,并且不会释放CPU等计算资源。是指LSF自动将低优先级作业暂停(suspend),将空余出来的资源交给高优先级队列中的作业使用,等到高优先级队列的作业结束后,再将被暂停的作业恢复(resume)并继续运行。

richycn的博客 1919

算法 第25天 回溯2

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9;每个数字 最多使用一次;返回 所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

qq_42799623的博客 315

【Pytorch教程】:卷积神经网络 CNN

Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 目录Pytorch教程目录什么是卷积神经网络 CNN卷积 和 神经网络池化(pooling)流行的 CNN 结构CNN 卷积神经网络MNIST手写数据CNN模型训练可视化训练全部代码 什么是卷积神经网络 CNN 卷积 和 神经网络 卷积神经网络是如何运作的呢, 举一个识别图片的例子, 我们知

nanke_4869的博客 8087

代码随想录第20天:回溯算法2

代码随想录训练营第20天:回溯2

weixin_70587313的博客 537

Pylon SDK C语言多相机采集的注意事项、关键设置及代码示例

前言 与单相机直接用句柄PYLON_DEVICE_HANDLE hdev进行操作所不同的是,在多相机连接采用索引值访问每个相机,对应句柄为PYLON_DEVICE_HANDLE hdev[deviceIndex] 。若连接N个相机设备,则索引值范围为[0,...,N-1]。显而易见,采用循环结构编程可以对多个相机采用同样的操作,包括参数设置、图像采集等。但多个相机的使用需要根据相机功能、相机与主机间的连接方式、网络适配器进行额外的设置。本文参考Pylon C开发者手册和Basler产品文档,对GigE类型

黑化咸鱼的博客 3089

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1330

代码随想录算法训练营第25天 | 回溯算法2

代码随想录算法训练营

X_ar_的博客 329

ROS2零拷贝避坑指南:Fast DDS共享内存配置常见问题与排查方法

本文深入解析ROS2 Humble中Fast DDS的零拷贝机制,提供共享内存配置的常见问题排查方法。从环境变量设置、XML配置文件到运行时诊断工具,全面指导开发者高效实现进程间数据传输优化,避免低效拷贝问题。特别针对/dev/shm无文件生成等典型场景给出解决方案。

weixin_30379531的博客 478

代码随想录算法训练营第二十三天|回溯法part2

判断startIndex到i之间的子串是否是回文串 如果是加入 继续更新startindex 继续下一轮判断。对于第二个1 前一个1没有被使用 并且第二个1与第一个1相等,此时不考虑这种情况 continue。used[i - 1] == false为什么是false的解释。另一个 可能出现 223 322这样的情况。错误之处:会出现重复的答案,没有去重。考虑112 目标值等于3。

xindafu的博客 203

【Bug已解决】zsh: command not found: claude 解决方案

方案适用场景推荐指数难度方案一:配置 npm 全局目录所有平台,长期使用⭐⭐⭐⭐⭐低方案二:修复 PATH 变量快速修复,不想改 npm 配置⭐⭐⭐⭐低方案三:重建软链接文件存在但链接断裂⭐⭐⭐中方案四:nvm 专属方案使用 nvm 管理多版本 Node.js⭐⭐⭐⭐低方案五:Windows 专属Windows 系统⭐⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 有问题⭐⭐⭐低根本原因。

博客 1万+

AUTOSAR从入门到精通-【自动驾驶】特斯拉全自动驾驶(FSD)

特斯拉全自动驾驶系统(Full-Self Driving,简称FSD)是特斯拉公司开发的高级驾驶辅助系统,旨在通过神经网络技术实现环境感知与车辆控制,在驾驶员监督下完成导航、转向、变道、泊车等操作。‌ 该系统自2021年发布Beta测试版以来持续迭代,最新版本为2025年10月推出的v14版本。‌FSD v14版本基于端到端神经网络架构,取代了传统代码逻辑,通过数百万视频片段训练模型,以模仿人类驾驶决策。‌ 其功能覆盖住宅区街道、城市道路及高速公路,支持交通信号识别、自动变道和环岛通行等场景。

getusushu的博客 570

开始学算法 x+2天 ===> 回溯探索第三章!哥布林深处(LeetCode刷题!!!)

回溯算法 java算法 数据结构

weixin_45576579的博客 515

装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼)

入职新公司,尤其是行业知识不懂的,面对前人堆积的屎山代码,各种文档又缺少的,有些技术自己又不懂的,如何快速上手代码,特别是借助AI大模型事半功倍的上手项目代码。进入新公司,我做的第一件事就是收集情报。我主动向同事们索要项目的相关资料,包括项目介绍文档、功能说明文档和业务流程图等。通过仔细阅读这些资料,可以对项目的背景和架构有了初步的了解。同时要逮住机会就向同事们请教项目的迭代历程和技术选型背后的考量。有时他们三言二语,可以为自己节省很多探索时间。在了解了项目的基本情况后,可以开始深入探究项目的业务流程。

大模型大数据攻城狮的专栏 1130

代码随想录算法训练营第二十四天 _ 回溯_ 77. 组合、2.两数相加、572. 另一棵树的子树。

学习回溯方法的套路

weixin_46367158的博客 95

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【算法设计与分析】2、回溯法

一、解的表现形式 一般回溯法,其解满足事先定义好的某个约束的向量(X1,X2,……Xn),要善于将变长解转化为定长解。 二、基本思想 每个xi属于一个有限的线序集Xi。 解向量空间取值属于:X1 x X2 ……Xn (笛卡尔积的元素)。 1、算法由空向量开始,选X1最小元素加入。 2、若x1为部分解,则选X2中最小元素作为x2加入,依次类推。 若部分为:(x1,x2,……xj) 需考虑下一情况 v= (x...

怪&的个人博客 556

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。什么是回溯算法?一道算法题走进回溯算法回溯算法框架套路leetcode案例分析回溯算法,一种通过探索所有可能的候选解来找出所有的解的算法。它采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。找到一个可能存在的正确的答案;

Blue_Pepsi_Cola的博客 7240

【算法专题】回溯算法

介绍回溯算法以及如何使用回溯算法解题!

YoungMLet的博客 3307

【算法】回溯算法

回溯算法

Code 小白的博客 6164

图解回溯算法

回溯算法 是什么? 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 可以解决什么问题? 排列、组合(子集、幂集、字符全排列)。 在传值时,对于排列问题,是要删掉单个用过的元素;组合问题,是删掉前面所有的元素。 数组、字符串,给定一个特定的规则,尝试搜索迭代找到某个解。 二维数组下的DFS搜索(八皇后、黄金矿工、数独)

粥同学的学习笔记 7380

搜索与回溯算法

为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。 一、前言 搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发...

程序员世杰 9386

【回溯算法】- 带你深入了解回溯

回溯到第三层,尝试其他列放置皇后: - 尝试在 (2, 2),发现冲突,回溯到第二层。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ]输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]- 选择在 (1, 2) 放置 Q。

2301_81253185的博客 2236

【进击的算法】基础算法——回溯算法

本文详细讲解回溯算法,深度刨析经典例题,希望对你理解回溯算法有所帮助

m0_73209194的博客 8316

【算法】回溯算法专题③ ——排列型回溯 python

回溯法是一种通过尝试每一种可能性来找到所有解的算法。对于N皇后问题,特别是带有额外约束条件的问题(如本题中的皇后之间在同一条45度角斜线上至少相隔3行),回溯法是一个非常合适的选择。

查理零世的博客 1653

回溯算法

第0层,节点个数 2^0=1第1层,节点个数 2^1=2第2层,节点个数2^2=4第3层,节点个数2^3=8自己递归调用自己2次,走出来的是二叉树。自己递归调用自己3次,走出来的是三叉树。以此类推。打印出来3^3=27个123。

ljy的博客 1251
上一篇: 回溯算法 -- 1天
下一篇: 代码随想录第一天和第二天的拓展题
七人酒
博客等级 码龄4年 51粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值