给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
public class LT39 { public static class Tree { int val; // 树的节点值 List<Integer> nodeInfo; // 用于保存节点路径信息 int sum; List<Tree> child; public Tree(int val, List<Integer> parentNodeInfo) { this.val = val; child = new ArrayList<Tree>(); this.nodeInfo = new ArrayList<Integer>(parentNodeInfo); this.nodeInfo.add(val); for (Integer nodeVal : nodeInfo) sum += nodeVal; } } public static List<List<Integer>> combinationSum(int[] candidates, int target) { Arrays.sort(candidates); List<List<Integer>> result = new ArrayList<List<Integer>>(); Queue<Tree> queue = new LinkedList<Tree>(); for (int i = 0; i < candidates.length; i++) { //初始化 queue.offer(new Tree(candidates[i], new ArrayList<Integer>())); } // 按层构造并且访问树 while (!queue.isEmpty()) { Tree temp = queue.poll(); if (temp.sum == target) { result.add(temp.nodeInfo); } if (temp.sum > target) continue; int index = Arrays.binarySearch(candidates, temp.val); for (int i = index; i < candidates.length; i++) { queue.offer(new Tree(candidates[i], temp.nodeInfo)); } } return result; } }