当前位置: 首页 > article >正文

算法--js--组合总和

题:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。
1 <= candidates.length <= 30
2 <= candidates[i] <= 40
candidates 的所有元素 互不相同
1 <= target <= 40

function combinationSum(candidates, target) {const result = [];candidates.sort((a, b) => a - b); // 先排序方便剪枝const backtrack = (path, start, remain) => {if (remain === 0) {result.push([...path]); // 深拷贝当前组合return;}for (let i = start; i < candidates.length; i++) {if (candidates[i] > remain) break; // 剪枝:当前值超过剩余值path.push(candidates[i]);backtrack(path, i, remain - candidates[i]); // 允许重复使用当前元素path.pop(); // 回溯}};backtrack([], 0, target);return result;
}console.log('combinationSum==>', combinationSum([2,3,5], 8)); // combinationSum==>[[2,2,2,2],[2,3,3],[3,5]]

算法核心:

排序剪枝
先对数组排序,当发现 candidates[i] > remain 时直接终止循环,避免无效递归。

回溯模板
path 记录当前组合路径
start 控制遍历起点,避免重复组合(如 [2,3,2] 和 [3,2,2])
remain 表示剩余需要凑的值
允许重复使用元素
递归时传递 i 而非 i+1,允许元素被重复选取。

时间复杂度:
最坏情况为 O(2^n),但题目保证组合数少于 150 个,实际性能优异。

优化点:
• 通过排序和剪枝减少递归深度
• 深拷贝避免引用问题
• 通过 start 参数避免重复组合

http://www.lryc.cn/news/2383642.html

相关文章:

  • 微服务中的 AKF 拆分原则:构建可扩展系统的核心方法论
  • vue element-plus 集成多语言
  • 如何测试JWT的安全性:全面防御JSON Web Token的安全漏洞
  • 车载网关策略 --- 车载网关重置前的请求转发机制
  • EtpBot:安卓自动化脚本开发神器
  • 连锁企业管理系统对门店运营的促进作用
  • 现代生活健康养生新策略
  • 车载以太网网络测试-27【SOME/IP-SD简述】
  • 云南安全员考试报名需要具备哪些条件?
  • Android Binder线程池饥饿与TransactionException:从零到企业级解决方案(含实战代码+调试技巧)
  • FFmpeg 超级详细安装与配置教程(Windows 系统)
  • 【Redis8】最新安装版与手动运行版
  • PyQt 探索QMainWindow:打造专业的PyQt5主窗
  • Spring Boot 集成 Elasticsearch【实战】
  • 06算法学习_58. 区间和
  • 如何在Java中进行PDF合并
  • Python爬虫之路(14)--playwright浏览器自动化
  • Python开启智能之眼:OpenCV+深度学习实战
  • 华为模拟器练习简单的拓扑图(3台路由器和2台pc)
  • uniapp生成的app,关于跟其他设备通信的支持和限制
  • 如何提高独立服务器的安全性?
  • 机器学习第十八讲:混淆矩阵 → 诊断模型在医疗检查中的误诊情况
  • Proxmox 主机与虚拟机全部断网问题排查与解决记录
  • 力扣560.和为K的子数组
  • MySQL——4、表的约束
  • 新浪、京东golang一面整理
  • Kotlin 协程 (二)
  • [250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
  • 【完整版】基于laravel开发的开源交易所源码|BTC交易所/ETH交易所/交易所/交易平台/撮合交易引擎
  • Android Framework学习七:Handler、Looper、Message