题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
注意:
1、candidates 中的数字可以无限制重复被选取;
2、所有数字(包括 target)都是正整数;
3、解集不能包含重复的组合。
示例 :
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7], [2,2,3] ]
注意点
1、排序和去除元素比目标值大的比较(if(arr[i] > target) break;),是为了加快搜索;
2、当target等于0时,lists必须添加拷贝list的值(lists.add(new LinkedList(list))),如果直接使用lists.add(list)会导致返回结果为null,因为lists集合存放的是引用数据类型的地址,回溯时会将lists中的list清空。
3、思路:
- 找和为7的组合,我们可以寻找2和5的组合、3和4的组合、6和1的组合或者7;
- 找和为5的组合,我们可以寻找2和3的组合、3和2的组合,其他组合同理可得;
- 直到结果target为0或者小于数组的所有元素。
实现
class Solution {
//存放解集
List<List<Integer>> lists = new LinkedList<