【代码随想录|回溯算法组合问题】

单片机技术入门与实战:从零基础到项目开发 单片机(MCU)作为嵌入式系统的核心组件,集成了CPU、内存和各种接口电路,广泛应用于智能家居、工业控制和汽车电子等领域。其工作原理基于实时控制和低功耗设计,通过定时器、中断系统和通信接口等功能模块实现各种控制任务。在物联网和智能硬件快速发展的背景下,掌握单片机开发技术成为电子工程师的重要技能。本文以STM32和PIC系列为例,详细解析单片机的基本概念、功能模块和选型指南,并分享从入门到项目实战的系统学习方法,帮助开发者在3-6个月内快速掌握这一关键技术。 阅读详情

代码随想录文章链接代码随想录

回溯算法理论

一、回溯法解决的问题

  • 组合问题:N个数里面按一定规则找出k个数的集合(无序的)
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式(有序的)
  • 棋盘问题:N皇后,解数独等

二、集合的宽度一般用for循环,集合的深度用递归

三、回溯算法模板

一般情况下用

void backtracking(参数)

参数一般比较多,遇到再往里加 

终止条件

if (终止条件) {巴拉巴拉 return;}

组合、切割、排列、棋盘问题一般在叶子节点上收割结果,子集问题是在每一个结点上都要搜集结果。

对节点的搜集处理

 for (集合中元素) {
        处理节点;
        递归;
        回溯,撤销处理结果;
    }

回溯算法三道题 

77.组合

题目链接https://leetcode.cn/problems/combinations

这里我自己理解的递归顺序呢是从(2,4,1)开始往后递归,开始进入for循环里面的backtracing那就是在对1进行组合了,

for循环i=1结束时 result 里面就应该已经有<1,2><1,3><1,4>了,然后我pop掉1进入

for循环i=2排序好 result 里面添加<2,3><2,4>,

for循环i=3往result里面添加<3,4>,

for循环i=4本来准备继续添加5的,但是5>n了所以这里因为是void就会直接返回给4了,然后我的4也被pop掉,

for循环结束最终这个函数返回给调用的(2,4,1)。

class Solution {
public:
    vector<int> path;//能满足条件的排列数组
    vector<vector<int>> result;//放满足的结果数组
    void backtracing(int n, int k, int startindex) {
        if (k == path.size()) {
            result.push_back(path);
            return;
        }
        for (int i = startindex; i <= n; i++) {
            path.push_back(i);
            backtracing(n, k, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracing(n, k, 1);
        return result;
    }
};

216.组合总和

题目链接https://leetcode.cn/problems/combination-sum-iii

这里可以进行剪枝,一个剪枝是在sum>要求的n就可以返回了,一个是在for循环里面i<=9-(k-path.size())+1,就是我现在可以还需要取k-path.size()那么多个,其实就跟刚刚那道题一样,刚刚那道题for循环改成i<=4-(k-path.size())+1有一个数据也是对的,一共4个数我选两个我递归执行到3就足够了,因为到4也添加不了新的结点最终也会被pop掉,但是因为这道题是要从1到9里面选嘛,除开我的这个节点在剩余节点中选就是i<=9-(k-path.size())+1

class Solution {
public:
vector<int>path;
vector<vector<int>> result;
 void backtracking(int k,int n,int sum,int startindex){
    if(sum>n)return;//剪枝
    if(path.size()==k){
        if(sum==n){
            result.push_back(path);
        }
        return;
    }
    for(int i=startindex;i<=9-(k-path.size())+1;i++){//剪枝,i<=n也对
        path.push_back(i);
        sum+=i;
        backtracking(k,n,sum,i+1);
        sum-=i;
        path.pop_back();
    }
 }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k,n,0,1);
        return result;
    }
};

17.电话号码的字符组合

题目链接https://leetcode.cn/problems/letter-combinations-of-a-phone-number

这里传入digits的大小就是我要每一个我要放进result的s的长度,也就是我遍历的深度,所以这里的递归终止条件是当我的index的大小和遍历的深度相等的时候我才添加结果集:

 if (index == digits.size())

 然后我遍历的宽度应该是这个数组所对应字符串的长度:

for (int i = 0; i < letter.size(); i++)

递归的顺序呢 比如我传入的是(2,3),[对应的字符"abc", "def"]  我先求出这个字符数组的第一个数所对应的字符串letter,然后我对letter的每个数进行递归:(这里的index指的每一个数字嘛(它只会遍历到深度的大小),所以我在进行 backtracking(digits, index + 1);的时候就是对第二个字符串进行选择了)

for循环i=0结束时 result 里面就应该已经有<a,d><a,e><a,f>,然后我pop掉a进入

for循环i=1排序好 result 里面添加<b,d><b,e><b,f>

for循环i=2往result里面添加<c,d><c,e><c,f>

for循环i=3已经不满足条件i<letter.size(),也就是i<3,直接返回到调用的 backtracking(digits, 0);返回result数组。

class Solution {
public:
    string s;
    vector<string> result;
    string lettermap[10] = {"", "", "abc", "def", 
"ghi", "jkl", "mno", "pqrs", "yuv", "wxyz"};
//虽然传入的数只从2到9,但是为了和下标一一对应要把0和一设置成""
    void backtracking(string digits, int index) {
        if (index == digits.size()) {//结束条件是index指向的数已经到空了才加到结果集
            result.push_back(s);
            return;
        }
        int digit = digits[index] - '0';
        string letter = lettermap[digit];
        for (int i = 0; i < letter.size(); i++) {
            s.push_back(letter[i]);
            backtracking(digits, index + 1);
            s.pop_back();//回溯
        }
    }
    vector<string> letterCombinations(string digits) {
        if (digits.size() == 0)
            return result;
        backtracking(digits, 0);
        return result;
    }
};

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号-并联端接 Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑并且进行并联端接,以下图为例,准备好发送接收端的IBIS模型, (se_example.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(W1_welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。 阅读详情

相关推荐

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4587

代码随想录回溯算法——组合问题

刷题总结

qq_39473176的博客 267

SquareLine Studio汉化版安装激活全攻略:LVGL嵌入式UI设计从入门到出代码

嵌入式GUI开发中,LVGL作为轻量级开源图形库,广泛应用于STM32、ESP32等MCU平台。可视化设计器通过拖拽生成LVGL代码,大幅提升UI开发效率。SquareLine Studio正是这类工具的代表,支持界面设计、事件绑定与代码导出。其安装、汉化与激活是初学者常见门槛,尤其涉及LVGL版本匹配、字体配置及FreeRTOS移植等关键环节。本文围绕汉化版安装、一个月免费激活码使用及最小可用流程展开,帮助开发者快速上手LVGL界面设计,规避常见环境与集成问题。

weixin_29189987的博客 412

代码随想录|回溯算法|02组合问题

第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。比如第一层我们取1,那么下面第二层就要取2,3,4,是从2开始取得,那么startIndex就是告诉我们需要从2开始取,也就是搜索的起始位置。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,

这里什么也没有 1147

fpga的希尔伯特变换实现

fpga的希尔伯特变换实现零.实现背景一.希尔伯特实现的基本原理2.实现1)matlab仿真1)fpga滤波器实现实现成本:fpga实现采用VIvado的FIR的IP核, 零.实现背景 因为今明工作项目需要使用到希尔伯特变换来处理问题,所以顺便就把设计流程和代码都整理下来,以便供他人使用。选用Xilinx的7系列板子,Vivado平台。 一.希尔伯特实现的基本原理 希尔伯特变换的物理意义十分简单:...

weixin_42219690的博客 1万+

open-web UI 实用指南

open-web UI 类似于chatgpt的界面,可以私有化模型本地部署,也可以用商业模型.本文只是用开源模型. 它以实现多模态AI聊天 , AI 翻译 , 语音转文本, 文本转语音, 文生图,代码助手,可谓利器。

szmars的博客 3万+

代码随想录Day20 回溯算法 LeetCode77 组合问题

这里我们按照上文所说就是我们for循环该登场了,这个时候我们的循环就得从startIndex开始到n结束,里面需要做的事情就是path.add元素,再进行backtracking,最后得pop元素进行一次回溯的过程,这里我们可以想象假设上面这个1234的例子,这里我收集了12这个例子,我想收获13这个结果是不是得将2弹出再将3进行添加呀,下面是代码演示。变量,来存放我们每条路径上的结果,因为这里我们可以将回溯过程想象成n叉树,所以叶子结点的结果也可以想象成路径的结果,然后定义一个。

qiuqiushuibx的博客 737

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 406

代码随想录-回溯算法(组合问题)|ACM模式

回溯算法三刷记录,ACM模式训练实记。

希希雾里 1106

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

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

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

代码随想录第十五天:回溯算法、组合问题、字母组合

代码随想录第十五天:回溯算法、组合问题、字母组合

qq_39962113的博客 943

第二篇:APS智能排产实战:OR-Tools与coptpy从入门到案例

专注于具体的技术实现,包括 OR-Tools 和 coptpy 的详细使用指南、建模技巧、日志解读,以及一个完整的两阶段生产排程案例。适合准备动手开发 APS 系统的工程师和研究者。

算法工程师 454

回溯算法理论基础及组合问题-代码随想录

回溯搜索法也是一种暴力的穷举可能的解法。,总之是一个for循环+递归。3.根据回溯法的本质,可以将其理解为一个树形结构。如下图所示。可以看出回溯最终要返回的值(也就是我们要找的值),就是多叉树的叶子节点。

usa_ham的博客 208

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

代码随想录-回溯算法-组合问题(Java)

回溯算法组合问题

weixin_45685902的博客 473

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

代码随想录算法训练营DAY24|C++回溯算法Part.1|回溯算法理论基础、77.组合、组合问题的剪枝操作

举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。既然回溯问题可以抽象成树形结构,那么遍历树形结构一定要有终止条件,所以回溯也要有终止条件。给他画一个回溯算法的搜索过程。

糖炒栗子 1332

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

回溯算法-代码随想录-组合问题-刷题笔记

回溯算法-代码随想录-组合问题-刷题笔记

Coderwind的博客 568

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合

本篇文章的所有内容仅基于C++撰写。

qq_43797172的博客 1009

代码随想录,第24天,回溯算法之组合问题

理解回溯三部曲与回溯算法的剪枝操作。

2302_79486697的博客 462

【代码随想录】【回溯算法】补day24:组合问题以及组合的优化

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

weixin_45929355的博客 436

代码随想录 | Day30 | 回溯算法:组合总和II&&切割问题

主要学习内容:树枝树层去重以及切割问题解法,模板总结。

m0_74795952的博客 811

二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

写链表之类的真的很痛苦,赶紧跳到回溯!这次我想结合算法设计这本书,把java版写出来。放在第三部分吧。希望能够在研一完成这项工作!从一刷总结以下的几个要点:回溯方法模板性非常强!!可以解决绝大部分的问题。(代码随想录的模板非常够用啦)!回溯树很重要,要画得出来!(集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。)以下是来自代码随想录的图!剪枝提高效率。会涉及排序和组合(组合是不强调元素顺序的,排列是强调元素顺序。会涉及到重复元素:层和树枝。理论基础:设置递归函数实现穷举!

anncyuyan的博客 1025

1、C++算法之代码随想录(回溯算法)——组合问题及优化

使用回溯法求解该问题其结构类似于树。层数代表递归的次数由k控制,每层的节点数由n控制。

qq_55527904的博客 405

代码随想录(回溯1)| 回溯算法的理论&77.组合问题

回溯算法的理论&77.组合问题

he979731102的博客 449

代码随想录day24|回溯算法理论基础、组合问题

回溯算法的本质是穷举,列举出各种可能,主要用于解决5种问题:组合问题、切割问题、子集问题、排列问题、棋盘问题。处理回溯问题一般采取三步:1、确定递归函数的返回值和参数 2、 回溯函数终止条件 3、单层搜索的过程。

qq_56966973的博客 282

代码随想录算法训练营day24 | 回溯问题,77. 组合

剪枝:for循环里的 i <= n - (k - path.size()) + 1,为剪枝操作,因为剩余的元素数量小于构成k所需元素的话,则没必要回溯了。startIndex记录下一层递归,搜索的起始位置。组合不需要考虑顺序问题。

超级马里奥 的博客 388
上一篇: 【代码随想录|二叉搜索树04】
下一篇: 【代码随想录|回溯算法02】
mazo_command
博客等级 码龄2年 275粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值