题目描述
给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。
candidates中数字可以无限制重复被选取。
思路
回溯+剪枝
说明:
- 蓝色结点表示:尝试找到组合之和为该数的所有组合,怎么找呢?逐个剪掉候选数组中的元素即可;
- 以 target = 7 为根节点,每一个分支做减法(减去的是数组中的每个数);
- 减到 0 或者 负数 的时候,到了叶子节点;
- 减到 0 的时候结算,这里 “结算”的意思是添加到结果集;
- 从根节点到叶子节点(必须为 0)的路径,就是题目要我们找的一个组合。
重复的原因:是在较深层的节点值考虑了之前考虑过的元素,因此需要设置“下一轮搜索的起点”即可。
去重复
- 在搜索的时候,需要设置搜索起点的下标 start,由于一个数可以使用多次,下一层的节点从这个搜索起点开始搜索;
- 在搜索起点 start 之前的数因为以前的分支搜索过了,所以一定会产生重复。
- 设置:下一轮搜索的起点 start = i