给定一个无重复元素的数组 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]
]
package leetCode5_20;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/**
* @author : caoguotao
* @date 创建时间:2019年5月24日 下午10:18:34
* @version 1.0
* @parameter
* @since
* @return
*/
public class Solution39 {
public static void main(String[] args) {
int[] candidates = {2,3,5};
List<List<Integer>> list = combinationSum(candidates, 8);
for (List<Integer> l : list) {
for (Integer num : l) {
System.out.print(num + " ");
}
System.out.println();
}
}
public static List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
Arrays.sort(candidates);
dfs(candidates, target, list, 0, temp);
return list;
}
public static void dfs(int[] candidates, int target, List<List<Integer>> list,
int index, List<Integer> temp) {
if(target == 0) {
list.add(temp);
return;
}
if(target - candidates[0] < 0) return;
for(int i = index; i < candidates.length && candidates[i] <= target; i++) {
List<Integer> l = new ArrayList<>(temp);
l.add(candidates[i]);
dfs(candidates, target - candidates[i], list,
i, l);
}
}
}