LeetCode--039--组合总和(java)

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。 

示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例 2:

输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

回溯   执行过程中 list的变化  [2] [2,2] [2,2,2] [2,2,2,2][2,2,2,null] [2,2,2,3] [2,2,2,null] [2,2,2,6] [2,2,2,null] [2,2,2,7] [2,2,2,null] [2,2,null] [2,2,3] [2,2,null] [2,2,6] ........

 1 class Solution {
 2     public List<List<Integer>> combinationSum(int[] candidates, int target) {
 3         List<List<Integer>> res = new ArrayList<>();
 4         if(candidates==null || candidates.length == 0) return res;
 5         helper(res,new ArrayList<>(),candidates,target,0);
 6         return res;
 7     }
 8     public void helper(List<List<Integer>> res,List<Integer> list,int[] candidates,int target,int start){
 9         if(target < 0)return;
10         if(target == 0){
11             res.add(new ArrayList<>(list));
12             return;
13         }
14         for(int i = start;i < candidates.length;i++){
15             list.add(candidates[i]);
16             helper(res,list,candidates,target - candidates[i],i);
17             list.remove(list.size() - 1);
18         }
19     }
20 }

2019-04-30 17:26:41

原文地址:https://www.cnblogs.com/NPC-assange/p/10797290.html