从组合总和到回溯模板:大厂算法面试的万能钥匙
在算法面试中组合总和系列问题是考察回溯思想的经典题型。这类问题要求我们找出所有满足特定条件的数字组合看似简单却能有效区分出候选人对算法思想的理解深度。本文将从一道经典的 LeetCode 题目入手深入剖析回溯法的核心并提炼出一套可复用的解题模板帮助你从容应对各种变种。一、问题引入组合总和我们先来看 LeetCode 第 39 题组合总和。给你一个无重复元素的整数数组candidates和一个目标整数target找出candidates中可以使数字和为目标数target的所有不同组合并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同则两种组合是不同的。示例输入candidates [2,3,6,7],target 7输出[[2,2,3], [7]]问题分析这个问题很容易让人联想到背包问题但它和传统的背包问题有本质区别特性传统背包问题组合总和问题核心目标求最大价值或判断可行性枚举所有满足条件的组合解法选择首选动态规划 (DP)首选回溯法 (Backtracking)动态规划虽然高效但它擅长的是“统计”和“最值”要还原出所有具体的组合方案实现起来会非常复杂。而回溯法作为一种暴力搜索的优化策略虽然在最坏情况下是指数级复杂度但在本题“组合数少于150个”的约束下配合高效的剪枝策略是更直接、更清晰的选择。二、核心思想回溯法回溯法本质上是一种深度优先搜索 (DFS)。我们可以把问题的解空间想象成一棵多叉树每个节点代表一个选择从根节点到叶子节点的路径就是一个候选解。我们的任务就是遍历这棵树找出所有符合条件的路径。解题思路针对“组合总和”我们的思路是排序预处理先对candidates数组进行排序。这一步有两个关键作用剪枝当我们发现当前选择的数字已经大于剩余目标值时由于数组已排序后面的数字只会更大因此可以直接终止当前分支的搜索。去重通过控制遍历的起始位置避免生成[2,3]和[3,2]这样的重复组合。构建回溯树选择从当前位置开始尝试选择一个数字加入当前路径。递归更新剩余目标值并从当前位置允许重复选择或下一个位置不允许重复选择继续递归。回溯当递归结束后撤销上一步的选择回到上一层尝试其他可能的分支。终止条件当剩余目标值为0时说明找到了一个有效组合将其加入结果集。当剩余目标值小于0或遍历完所有元素时终止当前分支。三、标准解题模板一招鲜吃遍天为了让你在面试中能够快速、准确地写出代码我将上述思路提炼成一套标准回溯模板。这套模板不仅适用于本题稍作修改即可解决 LeetCode 上的所有“组合总和”系列变种题。Python 模板代码defcombinationSum(candidates,target):# 1. 预处理排序为剪枝和去重做准备candidates.sort()res[]# 存储最终结果# 2. 定义回溯函数# start: 下一轮选择的起始索引核心防止重复组合# path: 当前已选择的数字路径# remain: 剩余需要凑齐的目标值defbacktrack(start,path,remain):# 3. 终止条件ifremain0:res.append(path.copy())# 注意必须拷贝否则后续操作会修改结果returnifremain0:return# 4. 遍历选择从start开始避免回头看foriinrange(start,len(candidates)):numcandidates[i]# 5. 剪枝当前数已大于剩余值后面的数更大直接跳出循环ifnumremain:break# 6. 做选择path.append(num)# 7. 进入下一层决策树# 注意本题允许重复选所以下一轮还是从 i 开始# 如果是不允许重复选的题如组合总和II这里改为 i 1backtrack(i,path,remain-num)# 8. 撤销选择回溯的核心path.pop()# 9. 调用回溯函数从索引0空路径目标值target开始backtrack(0,[],target)returnres模板核心要素面试必背要素代码体现核心作用去重逻辑for i in range(start, ...)规定只能向后选不能向前选从根源上避免了[3,2]这种与[2,3]重复的组合。重复选取backtrack(i, ...)本题允许无限次选取所以下一层递归从当前索引 i开始。剪枝优化candidates.sort()if num remain: break排序后如果当前数已经大于剩余值后面的数肯定更大直接终止整个循环大幅减少无效搜索。深拷贝res.append(path.copy())Python 中列表是引用类型必须拷贝当前状态否则后续pop操作会把结果集中的列表也清空。四、模板的威力应对变种题掌握了这套模板你就掌握了一把万能钥匙。只需要修改1-2 行代码就能解决 LeetCode 上的其他高频变种题。1. 组合总和 II元素有重复每个数只能用一次问题数组candidates中的每个数字在每个组合中只能使用一次且解集不能包含重复的组合。修改点递归起始索引从i改为i 1确保每个数只用一次。树层去重在for循环内增加if i start and candidates[i] candidates[i-1]: continue跳过同一层中值相同的元素避免生成重复组合。defcombinationSum2(candidates,target):candidates.sort()res[]defbacktrack(start,path,remain):ifremain0:res.append(path.copy())returnforiinrange(start,len(candidates)):ifcandidates[i]remain:break# 新增树层去重ifistartandcandidates[i]candidates[i-1]:continuepath.append(candidates[i])backtrack(i1,path,remain-candidates[i])# 修改i - i1path.pop()backtrack(0,[],target)returnres2. 组合总和 III只选1-9选k个数和为n问题找出所有相加之和为n的k个数的组合且组合中只允许含有 1 - 9 的正整数并且每种组合中不存在重复的数字。修改点候选数组固定为[1, 2, ..., 9]。终止条件增加对路径长度的判断if len(path) k。defcombinationSum3(k,n):candidateslist(range(1,10))res[]defbacktrack(start,path,remain):ifremain0andlen(path)k:# 修改增加长度判断res.append(path.copy())returniflen(path)k:# 新增提前剪枝returnforiinrange(start,len(candidates)):ifcandidates[i]remain:breakpath.append(candidates[i])backtrack(i1,path,remain-candidates[i])path.pop()backtrack(0,[],n)returnres五、总结与思考“组合总和”系列问题是回溯法的绝佳练手题。通过本文的学习我们可以得到以下几点启示选择比努力更重要面对问题首先要判断其核心目标。是求最值还是求所有解这直接决定了我们应该选择动态规划还是回溯法。模板是效率的保障在高压的面试环境下一套经过千锤百炼的模板能让你思路清晰避免因紧张而出错。记住“先排序再递归从start开始防重复numremain就剪枝选了就递归递归完就撤销”这句口诀。理解本质而非死记硬背模板是思想的载体。只有真正理解了回溯法“尝试-递归-回溯”的核心思想才能在面对千变万化的题目时灵活调整模板而不是生搬硬套。

相关新闻

双碳目标下综合能源系统IES联合低碳优化调度探索

双碳目标下综合能源系统IES联合低碳优化调度探索

分时优化机制碳交易双层需求响应优化综合能源系统IES联合低碳优化调度:双碳目标下综合能源系统优化调度采用四个场景控制变量分析调度优化模型(用MatlabYalmipCplex) 目标函数:系统运维成本、购能成本、碳交易成本,三部…

2026/5/17 10:26:52 阅读更多 →
招投标实战指南:【投标文件】编制全解析

招投标实战指南:【投标文件】编制全解析

前言 在商业竞争日益激烈的今天,招投标作为资源配置的重要手段,已成为企业获取项目、拓展市场的主要途径。无论你是建筑巨头还是科技新秀,无论你是百年老店还是初创企业,都绕不开“投标”这一关。而在整个招投标过程中&#xff0c…

2026/5/17 10:26:52 阅读更多 →
数据中台-大数据维度工程实施应用示例

数据中台-大数据维度工程实施应用示例

以下是基于全国省市销售统计场景的大数据维度工程实施 checklist 应用示例,展示如何将抽象的 checklist 落地到具体业务中:✅ 一、前期准备与业务对齐(销售统计场景)[x] 明确核心业务场景:全国各省市商品销售数据统计分…

2026/5/17 10:26:52 阅读更多 →

最新新闻

一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内的 internal 类型…

2026/7/3 19:47:05 阅读更多 →
PIC18F87K22与DS28EC20的1-Wire EEPROM存储方案

PIC18F87K22与DS28EC20的1-Wire EEPROM存储方案

1. 项目背景与核心需求 在嵌入式系统开发中,持久化存储用户设置和偏好是一个常见但关键的需求。想象一下,你开发了一个智能温控器,用户精心调整的温度偏好、定时设置和界面主题,如果每次断电后都需要重新设置,那体验会…

2026/7/3 19:47:05 阅读更多 →
如何修复Android设备认证问题:Play Integrity Fix完全指南

如何修复Android设备认证问题:Play Integrity Fix完全指南

如何修复Android设备认证问题:Play Integrity Fix完全指南 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 你是否曾经遇到过这种情况:解锁…

2026/7/3 19:47:05 阅读更多 →
DCS部署指南:生产环境数据收集服务最佳实践

DCS部署指南:生产环境数据收集服务最佳实践

DCS部署指南:生产环境数据收集服务最佳实践 【免费下载链接】dcs DCS(Data Colleciton Service) is a service for collecting performance data. 项目地址: https://gitcode.com/openeuler/dcs 前往项目官网免费下载:https://ar.openeuler.org/a…

2026/7/3 19:45:04 阅读更多 →
Mermaid Live Editor:如何用代码思维彻底改变你的图表创作方式?

Mermaid Live Editor:如何用代码思维彻底改变你的图表创作方式?

Mermaid Live Editor:如何用代码思维彻底改变你的图表创作方式? 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me…

2026/7/3 19:45:04 阅读更多 →
解锁AMD Ryzen隐藏性能:SMU调试工具深度掌控指南

解锁AMD Ryzen隐藏性能:SMU调试工具深度掌控指南

解锁AMD Ryzen隐藏性能:SMU调试工具深度掌控指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode…

2026/7/3 19:45:04 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻