/** * 本题的要求是当前元素可以重复使用,那么递归的时候只需要把自身下标传进去就可以了 * 同样也需要一个结果集,装载目前数字的小集合 */ public List<List<Integer>> combinationSum(int[] candidates, int target) { tracking(candidates, target, 0); return rt; }
public void tracking(int[] candidates, int target, int startId) { if (sum > target) { return; } if (sum == target) { rt.add(new ArrayList<>(items)); return; } for (int i = startId; i < candidates.length; i++) { items.offer(candidates[i]); sum += candidates[i]; tracking(candidates, target, i);//此处是关键点,因为集合的元素可以重复使用,用这里是i而不是i+1 sum -= candidates[i]; items.removeLast(); } }
/** * 结果集 */ private List<List<Integer>> rt = new ArrayList<>();
/** * 小集合,用来回溯使用的(使用双端队列比较好操作) */ private LinkedList<Integer> items = new LinkedList<>();