【题目练习】算法 组合总和||

具体题目:

解题:

这样解题出来是无法运行的,问题是少了这个

递归回溯函数backtrack

返回值:int**,二维数组,所有答案组合。

*returnSize:输出参数,告诉调用者一共多少组答案。

*returnColumnSizes:输出参数,int 数组,每个元素记录对应组合有几个数字。

正确的解题:

运行结果:

一、读题

1、每个数字在一个组合里只能用 1 次(数组本身可以有重复元素,比如数组有两个 1,结果可以

用两个 1,但不能同一个位置元素重复选)

2、最终结果不能有重复组合,比如不能同时出现1,7和7,1,也不能两个一模一样的1,1,6

3、找出所有和等于 target 的组合。

和之前对比【组合总和 I】:I 里面元素可以无限复用;II 每个元素最多选一次,数组存在重复数字。

重点: 解决去重:

1、先排序数组!把相同数字挨在一起。排序是去重的前提。

2、回溯 dfs:传参:当前遍历起始下标 start,当前路径 path,剩余需要凑的数remain。

start:保证不从前面回头选,避免1,7和7,1这种顺序不同的重复。

因为元素只能选一次:递归下一层 start = i+1,而不是 i(组合 I 是 start=i,可以重复选自己)

3、同层去重:如果 for 循环当前 i>start,并且candidatesi==candidatesi‑1,直接 continue 跳过。

区分:

i>start:代表同一层递归,遇到和前一个一样的值,跳过,防止产生重复组合;

如果 i==start,是深度往下走,允许选重复数字(比如两个 1 的情况,允许取两个 1)。

4、剪枝

排序后,如果candidatesi>remain,后面更大,直接 break。

三、

1、qsort排序:10,1,2,7,6,1,5排序后变成1,1,2,5,6,7,10。相同数字相邻。

2、backtrack中i>start && candidatesi==candidatesi‑1 continue;

i==start:代表深度往下搜,可以取第二个 1;

i>start:同一层循环,前面已经用过这个数字产生过答案,跳过,防止重复组合。

3、递归调用参数i+1:和组合总和 I 最大区别! 每个元素只能选一次,下一轮不能再访问 i 下标。组合 I 传 i,可以重复选取。

4、candidatesi>remain break:排序后剪枝,后面数字更大,没必要继续循环。

四、终止

remain==0,剩余需要凑的数等于0,当前path就是有效组合。

要把path复制一份存进res(不能直接存进path数组,因为path后续回溯会被覆盖修改)

相关推荐
ZhengEnCi7 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David7 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi7 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6188 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang8 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703839 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02149 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi10 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang11 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!11 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法