组合总和的归纳总结
组合总和题目类型
组合总和在力扣上主要有四种形式。
其中,前三道通常采用回溯法来做,第四道采用动态规划来做。
组合总和关键点
对以上的题目进行总结,可以发现组合总和有几个关键点。
1. 数组有无重复元素。无重复元素①,有重复元素②
2. 同一个数字是否可以被无限次选取。每个数字只能被选取一次③,每个数字可以被无限次选取④
3. 顺序不同的序列被视作不同的组合(排列)⑤,顺序不同但是元素相同被视作相同的组合(组合)⑥
其中,组合总和①④⑥,组合总和Ⅱ②③⑥,组合总和Ⅲ①③⑥,组合总和Ⅳ①④⑤
分析
几种组合总和之间的关系
可以注意到,组合总和与组合总和Ⅳ的区别在于结果是组合形式还是排列形式。此外,由于组合总和Ⅳ的数据量更大,因此采用回溯算法会造成超时。 同时由于结果不需要将全部方案列出,只需要返回方案的种类,那么动态规划做法是最合适的。
组合总和Ⅱ与组合总和Ⅲ的差别在于数组中是否有重复元素。因此,组合总和Ⅱ在实现中需要专门用sort()和vis数组实现。
②⑥组合,需要借助sort()排序和vis数组实现
有③,回溯法下次迭代时idx还是从i+1开始
for(int i = idx; i < n; i ++ ) { path.push_back(candidates[i]); dfs(candidates, target, n, i + 1, sum + candidates[i]); path.pop_back(); }
有④,回溯法下次迭代时idx还是从i开始
for(int i = idx; i < n; i ++ ) { path.push_back(candidates[i]); dfs(candidates, target, n, i, sum + candidates[i]); path.pop_back(); }
其余的组合类型题目
②④组合不可能出现,否则②会失去意义。
因此,其实还可以有两种组合类型的题目:分别是①③⑤和②③⑤。
如果①③⑤和②③⑤求最终方案的数量,均可以采用动态规划01背包做法,先遍历背包再遍历物品。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?