给定一个无重复元素的数组 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; } }
本文介绍了一种解决组合总和问题的算法实现。通过构建树结构遍历所有可能的组合,寻找目标数值的有效路径。文章详细展示了如何使用队列进行层次遍历,并通过示例代码解释了关键步骤。
689

被折叠的 条评论
为什么被折叠?



