代碼隨想錄算法訓練營|第二十七天|回溯算法理论基础、77. 组合。刷题心得(c++)

代码随想录-算法训练营day24【回溯算法01:理论基础、组合】 阅读详情

目录

讀題

回溯算法理论基础

77. 组合

看完代码随想录之后的想法

77. 組合 - 實作

思路

未剪枝(未縮小遍歷範圍)

剪枝(縮小遍歷範圍)

代碼

未剪枝(未縮小遍歷範圍)

剪枝(縮小遍歷範圍)

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料

第七章 回溯算法part01

理论基础

77. 组合


讀題

回溯算法理论基础

看完回溯算法理論基礎後,主要有幾個重點

  1. 效能: 回溯算法本質是窮舉法,就算可以縮小範圍,但本質並非是個高效的算法

  2. 能解決的問題

    • 組合: N個數裡面根據一定規則找出K個數的集合
    • 排序: N個數裡面根據一定規則排序,有多少排列方式
    • 切割: 字符串按一定規則有幾種切割方式
    • 子集: 一個N個數的集合有多少符合條件的子集
    • 棋盤: N皇后、解數獨
  3. 回溯法模板

    void backtracking(參數) {
    		if (終止條件) {
    				存放結果;
    				return;
    		}
    		
    		for(選擇: 本層有多少元素){
    				處理節點;
    				backtracking(路徑,選擇列表) \\\\遞迴
    				回溯,撤銷處理結果
    		}
    		return;
    }
    
  4. 模板中的for迴圈可以理解為橫向遍歷、遞迴可以理解為縱向遍歷,如下圖(圖來源: 代碼隨想錄)

77. 组合

看完代码随想录之后的想法

看完之後,可能因為有先做二叉樹的題目,所以理解不難,今天在看完解題之後,過了兩三個小時回到電腦前認真做題,因為對於觀念很清晰,所以一般解法以及剪枝的寫法都不難理解

77. 組合 - 實作

思路

未剪枝(未縮小遍歷範圍)

  1. 建立results儲存結果,建立path建立符合條件的結果
  2. 建立函數backtracking
    1. 參數n , k , startindex (startindex 決定下一層由那裡開始)
    2. 終止條件: 如path的長度 == k 代表已找到組合,將結果放入results 並return
    3. 單遞迴
      1. for 橫向遍歷
      2. 處理當前數值放入path
      3. backtracking 遞迴,縱向遍歷
      4. 回溯操作,撤回之前放入的值
  3. 主函數
    1. 遞迴
    2. return results

剪枝(縮小遍歷範圍)

  1. 建立results儲存結果,建立path建立符合條件的結果
  2. 建立函數backtracking
    1. 參數n , k , startindex (startindex 決定下一層由那裡開始)
    2. 終止條件: 如path的長度 == k 代表已找到組合,將結果放入results 並return
    3. 單遞迴
      1. for 橫向遍歷,並且由最多遍歷到長度n,改為"最多”遍歷到n - (k - path.size()) + 1 的長度,+1是因為要包含自己。
      2. 處理當前數值放入path
      3. backtracking 遞迴,縱向遍歷
      4. 回溯操作,撤回之前放入的值
  3. 主函數
    1. 遞迴
    2. return results

代碼

未剪枝(未縮小遍歷範圍)

class Solution {
public:
    vector<vector<int>> results;
    vector<int> path;
    void backtracking(int n, int k, int startindex) {
        //終止條件
        if( path.size() == k) {
            results.push_back(path);
            return;
        }
        //單遞迴
        for(int i = startindex; i <= n ; i++){
            path.push_back(i);
            backtracking(n, k, i + 1); //i + 1 是因為要遞迴i後面的值
            path.pop_back(); //回溯操作
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1); //數由1開始,所以要帶入1
        return results;
    }
};

剪枝(縮小遍歷範圍)

class Solution {
public:
    vector<vector<int>> results;
    vector<int> path;
    void backtracking(int n, int k, int startindex) {
        //終止條件
        if( path.size() == k) {
            results.push_back(path);
            return;
        }
        //單遞迴,n - 目標長度與目前長度的差
        for(int i = startindex; i <= n - (k - path.size()) + 1 ; i++){
            path.push_back(i);
            backtracking(n, k, i + 1); //i + 1 是因為要遞迴i後面的值
            path.pop_back(); //回溯操作
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1); //數由1開始,所以要帶入1
        return results;
    }
};

 

總結

自己实现过程中遇到哪些困难

今天因為有先聽卡哥講解,所以在理解上沒有遇到太大的困難,只是需要多練習這些題目

今日收获,记录一下自己的学习时长

今天大概學習1.5hr ,整體對於回溯的作法有了新的認知。

相關資料

● 今日学习的文章链接和视频链接

第七章 回溯算法part01

理论基础

题目链接/文章讲解:https://programmercarl.com/回溯算法理论基础.html

视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili

77. 组合

题目链接/文章讲解:https://programmercarl.com/0077.组合.html

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

Redis中什么是Big Key(大key)问题?如何解决Big Key问题? 通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一 阅读详情

相关推荐

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1014

代码随想录算法训练营第二十二天|LeetCode 回溯算法理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

一篇文章搞懂回溯算法!回溯算法答题模板!组合问题经典例题!

Anastasia_sakura的博客 1082

亚马逊广告接口 amazon advertising

亚马逊广告接口官方说明:https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup 一:注册aws开发者账号 注册地址:https://developer.amazon.com 二:填写注册资料 三:进入控制台,生成安全配置文件 进入 Login with Amazon 菜单: 创建配置文件: 四:申请广告接入权限 申请地址:https://advertising.amazon.com/zh-cn/about-api

lzy66666的博客 4775

代码随想录刷题总结

代码随想录刷题总结

Rocket,Qian的博客 1288

spyglass之功耗分析

用于功耗分析的软件除了ptpx外,spyglass也可以。ptpx的功耗分析是基于netlist(网表)进行的,一般用于分析综合后的pre功耗和P&R后的post功耗,但这已经是项目进行到比较后期了,如果后期发现功耗数据与我们目标功耗相差较大,则意味着需要功耗优化,这时有可能会将项目计划节点延迟。如果在前期designer可以获得设计模块的功耗数据,可提早优化功耗,spyglass则为designer提供了一个很好的手段去评估功耗,从而提前优化功耗。

u011974971的博客 9191

智能座舱-语音交互系统

从什么是智能座舱、智能座舱的发展驱动因素、智能座舱的构成要素三个方面梳理我对智能座舱的基础认识之后,为了加深“智能座舱产品入门”课程中语音交互部分知识的理解,我从什么是语音交互、语音交互的底层技术、智能座舱的语音交互等方面,对智能座舱语音交互系统相关的知识进行了梳理与总结。

GUOSA0928的博客 1440

代码随想录算法训练营第十九天 | 回溯算法理论、77. 组合、216. 组合总和 III、17. 电话号码的字母组合

代码随想录算法训练营第十九天 | 回溯算法理论、77. 组合、216. 组合总和 III、17. 电话号码的字母组合 (都用回溯模板)

dewi的博客 883

YOLO26改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 208

代码随想录算法训练营Day19| LeetCode 77 组合、216 组合总和 III、17 电话号码的字母组合

代码随想录算法训练营第十九天!开启回溯算法章节!

修炼途中的所见所闻,所思所想。 1112

一条时间轴上的商品供给:商品供给域事件全景、八大子域事件清单与事件契约规范的工程推演

本文以虚构连锁零售企业“青禾鲜市”为例,用事件风暴重新梳理商品供给域:先剖析同词异义、状态模糊、隐式依赖与被动兜底四类冲突,再以时间轴、八条子域泳道与关键事件铺出全景地图,确立一个事件只有一个户口;随后为总店商品、门店商品、价格、库存、质量、标签、变更通知与操作日志列出聚合、事件、命令与策略,并统一命名、信封结构、版本与幂等规范。程序体检把初稿14个问题清零,仿真显示按聚合版本号更新可售视图可将误判从两位数百分比降到0.019%。文末给出四轮工作坊节奏与新品引入、全国调价、批次召回走查剧本。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

199、影像技术 roadmap 规划:未来移动影像的技术趋势与芯片算力展望

本文探讨了未来移动影像技术的发展趋势与芯片算力规划。作者从实际案例出发,指出影像技术演进需平衡传感器、ISP、算力和功耗。文章分为三部分:1)传感器将从堆像素转向提升信息密度,重点关注双层晶体管结构、混合快门和多光谱技术;2)ISP架构将向可编程计算单元转型,强调神经网络加速、硬件化多帧融合和语义处理;3)芯片算力瓶颈在于数据搬运,需优化存算一体架构、专用DMA和统一内存。最后给出五点建议:避免盲目追高像素、重视持续功耗、平衡ISP灵活性、预留算力余量、加强传感器与ISP协同设计。作者强调,影像技术的突破在

sundong_81的博客 57

代码随想录算法训练营第51期第22天 | 回溯算法理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

我先写最新的,免的欠太多不写了。

qyy123ise的博客 639

具身智能机器人算法控制研究进展综述

具身智能(Embodied Intelligence)作为人工智能与机器人学的交叉前沿领域,强调智能体通过物理身体与环境的持续交互涌现智能行为。近年来,随着基础模型(Foundation Models)、扩散策略(Diffusion Policy)、视觉-语言-动作(Vision-Language-Action, VLA)模型以及大规模机器人数据集(如Open X-Embodiment)的快速发展,具身智能机器人的算法控制范式正经历深刻变革。

VectorShift的博客 226

代码随想录算法训练营day24|回溯理论基础、77.组合

回溯算法是一种试探性的算法,用于解决组合优化问题。这类问题通常涉及在给定的候选集中找出满足特定条件的所有解。回溯算法通过深度优先遍历的方式,探索决策树的所有可能分支,从而找出所有解,就树而言,我们很容易想到递归,递归和回溯是相辅相成的。回溯法要解决的问题都能抽象成树形结构,也以此,回溯算法的基本思想是,从树的根节点开始,按某种顺序尝试所有可能的选择(例如,从左到右)。每做出一个选择,就生成一个新的节点,然后递归地继续进行选择。

github_35852648的博客 642

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

代码随想录算法训练营回溯算法Day-22 | 理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

比如C(4,4),当i=2时,其实能选的元素只有3,4了,最多只能选3个了,所以遍历2其实是没必要的,这就是剪枝操作的由来,由于每次for循环其实都是对应一个子孩子,所以现在不需要遍历每个子孩子(比如1,2,3,4不需要遍历2,3,4)所以就要从for循环的范围做文章。回溯法解决的都是在集合中查找子集,所以集合的大小构成树的宽度,递归的层数构成树的深度,由于递归都有终止条件,所以一定是有限高的N叉树。回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

m0_65939761的博客 566

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

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

代码随想录算法训练营第二十二天

这个算法通过回溯法穷举了所有可能的字母组合,时间复杂度是 O (3^m * 4^n),其中 m 是对应 3 个字母的数字个数,n 是对应 4 个字母的数字个数(7 和 9)。这个算法的时间复杂度是 O (C (n,k)×k),其中 C (n,k) 是组合数,空间复杂度是 O (k)(递归栈深度和 path 的大小)。这段代码实现了 "组合总和 III" 的问题求解,即从 1 到 9 中选取 k 个不重复的数字,使得它们的和等于 n,找出所有可能的组合。这是一个经典的回溯算法应用场景。

2403_87481241的博客 1115

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

代碼隨想錄算法訓練營|第二十九天|39. 组合总和、40.组合总和II、131.分割回文串。刷题心得(c++)

目录 讀題 39.组合总和 自己看到题目的第一想法 看完代码随想录之后的想法 40.组合总和II 自己看到题目的第一想法 看完代码随想录之后的想法 131.分割回文串 自己看到题目的第一想法 看完代码随想录之后的想法 39.组合总和 - 實作 思路 錯誤思路 正確思路 剪枝思路 Code 錯誤代碼 正確代碼 剪枝代碼 40.组合总和II - 實作 思路 錯誤思路 正確思路 使用used的思路 Code 錯誤思路 正確思路 使用used 的思路 1

RVLIN的博客 1023

代码随想录算法训练营第24、25天|回溯理论基础、组合问题、216.组合总和III 17.电话号码的字母组合

回溯可以用于解决一些经典的问题,可以看到理论框架回溯的框架。

Calliops的博客 789

代码随想录算法训练营Day23

力扣131.分割回文串【medium】 力扣.20组合——剪枝优化【medium】 力扣216.组数总和Ⅲ【medium】

lololo的博客 733

【代码随想录】【算法训练营】【第24天】 [77]组合

回溯算法 组合问题

day day up 485

代码随想录算法训练营第二十二天 | 77. 组合, 216.组合总和III & 17.电话号码的字母组合

训练营已经结束了,果然没有跟上进度打卡害 但是比上一期已经有进步了!继续加油 争取在接下来两个月补完!然后二刷。

2301_78860250的博客 446

代码随想录算法训练营第二十一天| 77. 组合、216.组合总和III、17.电话号码的字母组合

目标:给定两个整数n和k,返回[1, n]中所有可能的k个数的组合。[1,2][2,1]

weixin_73559547的博客 598

代码随想录算法训练营第二十二天| 回溯算法理论基础、 77 组合、 216 组合总和III

代码随想录算法训练营第二十二天| 回溯算法理论基础、 77 组合、 216 组合总和III

SSaltedFish_tian的博客 205

[算法训练营] 回溯算法专题(一)

本篇为回溯算法专题的刷题题单,总共5道题,每道题都有对应的链接。边听歌边刷题吧~

进一步有一步的欢喜 764

代码随想录算法训练营 Day19 | 回溯算法 part01

确定返回值和参数:返回值通常为void,参数根据题目需求定(这里是范围n、目标数量k、起始位置startIndex确定终止条件:当路径长度满足要求()时,保存结果并返回。确定单层搜索逻辑:for循环横向遍历(从startIndex到n递归纵向遍历。核心:和构成了回溯的“做选择”与“撤销选择”。组合问题:依然是从集合中选 k 个数(这里是 1-9)。增加约束:不仅要选够 k 个,还要满足和 == n。参数变化:回溯函数多了一个sum。

2401_86818319的博客 471

代码随想录算法训练营第二十二天 | 77. 组合、216. 组合总和 III、17. 电话号码的字母组合

文档讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html。文档讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html。

m0_45175414的博客 705
上一篇: 代碼隨想錄算法訓練營|第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、第六章 二叉樹 - 總結。刷题心得(c++)
下一篇: 代碼隨想錄算法訓練營|第二十八天|216.组合总和III、17.电话号码的字母组合。刷题心得(c++)
RVLIN
博客等级 码龄5年 104粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值