回溯算法解决组合总和II问题与优化策略
1. 问题背景与理解组合总和II是LeetCode上经典的算法题目编号40属于回溯算法的典型应用场景。这道题与基础版的组合总和39题相比最大的区别在于候选数组中可能包含重复元素但要求最终解集中不能包含重复的组合。这在实际开发中对应着很多真实场景比如电商平台的优惠券组合推荐、投资组合优化等需要避免重复方案的业务需求。我第一次遇到这个问题时直观想到的是直接用标准回溯模板结果发现会生成大量重复解。比如候选数组[1,1,2,5]目标和为8时[1,2,5]会重复出现两次。这让我意识到需要设计更精细的剪枝策略。2. 算法核心思路解析2.1 回溯算法框架回溯算法的基本框架包含三个关键部分路径记录保存当前已选择的元素选择列表当前可选的元素范围结束条件达到目标或无法继续选择对于组合总和问题标准模板如下def backtrack(path, choices, target): if target 0: result.append(path) return for i in range(len(choices)): if choices[i] target: continue backtrack(path[choices[i]], choices[i:], target-choices[i])2.2 去重关键策略当数组包含重复元素时上述方法会产生重复解。我们需要两个关键改进排序预处理先对数组排序使相同元素相邻层级去重在同一层级遍历时跳过与前一个元素相同的候选具体实现时要注意去重判断应该是i start_index and candidates[i] candidates[i-1]而不是简单的相邻比较。这样才能保证不同层级可以选取相同值元素。3. 完整实现与优化3.1 Python实现详解def combinationSum2(candidates, target): candidates.sort() res [] def backtrack(start, path, remaining): if remaining 0: res.append(path.copy()) return for i in range(start, len(candidates)): # 剪枝剩余值不足 if candidates[i] remaining: break # 去重关键跳过同一层级的重复元素 if i start and candidates[i] candidates[i-1]: continue path.append(candidates[i]) backtrack(i1, path, remaining - candidates[i]) path.pop() backtrack(0, [], target) return res时间复杂度分析最坏情况O(2^n)每个元素都有选或不选两种可能实际通过剪枝会好很多空间复杂度O(n)递归栈深度不超过数组长度3.2 关键优化点提前排序不仅为去重也为后续剪枝创造条件剩余值剪枝当当前候选大于剩余目标值时可提前终止循环路径拷贝优化只在加入结果时复制path减少内存操作4. 应用场景与变种4.1 实际工程应用电商促销组合从可用优惠券中找出总和等于订单金额的组合避免重复方案资源分配将有限资源分配给多个项目每个项目有最小投入要求菜单规划从食材中选择搭配正好用完库存且营养达标4.2 常见变种题型限制组合长度如要求解的个数必须是k个元素多条件组合除了数值和还需满足其他约束条件概率最大化每个元素有概率值求概率乘积最大的组合5. 调试与边界情况5.1 常见错误排查重复解问题检查是否漏了排序步骤确认去重条件是i start而非i 0遗漏有效解检查递归时是否错误地跳过了可用的候选确认剪枝条件是否正确还是无限递归确保每次递归的start参数正确递增检查剩余值更新是否正确5.2 测试用例设计有效测试应包含tests [ # 基础案例 ([2,3,5], 8, [[3,5]]), # 含重复元素 ([1,1,2,5], 8, [[1,2,5],[1,1,2,4]]), # 无解情况 ([2,4,6], 7, []), # 空输入 ([], 5, []), # 目标为0 ([1,2], 0, [[]]) ]6. 算法扩展思考对于特别大的候选集如n100标准回溯可能不够高效。可以考虑以下优化方向动态规划预处理先用DP找出可能的和值组合再反向追踪具体元素组合并行计算将候选集分割为多个子集在不同线程/进程中分别处理记忆化搜索缓存中间结果避免重复计算相同子问题在实际面试中建议先给出标准回溯解法再讨论优化可能。面试官通常更关注对算法本质的理解而非极端优化。

相关新闻

同花顺APP hexin-v 算法分析(webview)

同花顺APP hexin-v 算法分析(webview)

声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口 等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介或…

2026/10/7 5:21:35 阅读更多 →
红外温度传感器:替代选型之前,工程师需要想清楚的五个核心问题

红外温度传感器:替代选型之前,工程师需要想清楚的五个核心问题

评估替代红外测温传感器方案之前,有几个问题值得每一位工程师花足够的时间去想清楚。这个过程不是列一张参数对比表然后画勾画叉,而是对应用场景的一次全面审视。被测物的材质与发射率第一个问题:被测物是什么材质,什么颜色。这不…

2026/10/13 6:41:33 阅读更多 →
3D引擎选型实战:从游戏到网页,五大场景深度解析

3D引擎选型实战:从游戏到网页,五大场景深度解析

1. 项目概述:从游戏到网页的3D引擎跨界浪潮最近几年,一个非常明显的趋势是,3D技术正在以前所未有的速度“破圈”。过去,一提到3D引擎,大家脑海里浮现的几乎都是《原神》、《黑神话:悟空》这类顶级游戏大作&…

2026/10/7 0:53:31 阅读更多 →

最新新闻

双电机项目的学习记录1

双电机项目的学习记录1

cubemx里的配置问题,为什么这样配System Core → RCC → High Speed Clock (HSE) 选 Crystal/Ceramic Resonator所以才这样配置是为了精度更高-----------------------------------------------------------------------------------------------------------------…

2026/10/15 4:04:46 阅读更多 →
page_alloc alloc_pages_exact_noprof

page_alloc alloc_pages_exact_noprof

alloc_pages_exact_noprof() 是 alloc_pages_exact() 的无 profiling 底层实现,核心目标是分配“恰好满足需求”的物理连续内存,而非伙伴系统默认的 2 的幂次页块。设计动机:消除高阶分配的浪费伙伴系统只能按 2^order 个页分配。如果你需要 …

2026/10/15 4:04:46 阅读更多 →
SAP ABAP DDIC Table Type 深度解析,从 Internal Table 类型蓝图到主键、辅助键与 Clean Core

SAP ABAP DDIC Table Type 深度解析,从 Internal Table 类型蓝图到主键、辅助键与 Clean Core

在一个规模稍大的 SAP ABAP 项目里,经常会看到这样的声明。 DATA lt_flights TYPE spfli_key_tab.代码只有一行,但这里其实已经确定了很多东西。lt_flights 的每一行长什么样,它到底是 STANDARD TABLE、SORTED TABLE 还是 HASHED TABLE,哪些字段组成主键,主键是否允许重复…

2026/10/15 4:04:46 阅读更多 →
page_alloc alloc_pages_exact_nid_noprof

page_alloc alloc_pages_exact_nid_noprof

alloc_pages_exact_nid_noprof() 是 alloc_pages_exact() 的 NUMA 节点限定版本,并在 noprof重构中被引入。核心作用与设计动机它的核心目标是:在指定 NUMA 节点上优先分配“恰好满足需求”的物理连续内存。与 alloc_pages_exact_noprof() 的关键区别在于…

2026/10/15 4:04:46 阅读更多 →
为什么很多人的经验无法长期积累?

为什么很多人的经验无法长期积累?

记忆留不住的客观规律很多人觉得经验攒不下来是自己不用心,其实大脑本身就不擅长长期存储高密度的细节信息。认知心理学的追踪数据显示,人对具体场景下的信息细节,72小时后的自然留存率仅为29%,剩下的内容会被大脑自动修剪成模糊的…

2026/10/15 4:04:46 阅读更多 →
Map 中删除一个 key,它的内存会释放么?

Map 中删除一个 key,它的内存会释放么?

在 Go 语言开发中,我们频繁使用内置函数 delete(m, key) 来删除哈希表中的元素。许多开发者直觉上会认为:既然删除了 key,对应的内存就应该被操作系统或 Go 垃圾回收器(GC)回收。然而事实并非如此:调用 del…

2026/10/15 4:03:46 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →