Loading... # 回溯算法 39. 组合总和 给你一个 无重复元素 的整数数组 `candidates` 和一个目标整数 `target` ,找出 `candidates` 中可以使数字和为目标数 `target` 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 `candidates` 中的 同一个 数字可以 __无限制重复被选取__ 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 `target` 的不同组合数少于 150 个。 示例 1: ``` 输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释: 2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。 7 也是一个候选, 7 = 7 。 仅有这两种组合。 ``` 示例 2: ``` 输入: candidates = [2,3,5], target = 8 输出: [[2,2,2,2],[2,3,3],[3,5]] ``` 示例 3: ``` 输入: candidates = [2], target = 1 输出: [] ``` 提示: `1 <= candidates.length <= 30` `2 <= candidates[i] <= 40` `candidates` 的所有元素 互不相同 `1 <= target <= 40` ## 代码 ```java package ski.mashiro.leetcode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class _39 { /** * 39. 组合总和 * <p> * 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target * 找出 candidates 中可以使数字和为目标数 target 的所有不同组合 ,并以列表形式返回。 * <p> * 你可以按 任意顺序 返回这些组合。 * <p> * candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 * <p> * 对于给定的输入,保证和为 target 的不同组合数少于 150 个。 */ public static void main(String[] args) { int[] arr = {2, 3, 6, 7}; System.out.println(combinationSum(arr, 7)); } public static List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> rsList = new ArrayList<>(); // 剪枝前提 Arrays.sort(candidates); backtrack(candidates, target, rsList, new ArrayList<>(), 0, 0); return rsList; } private static void backtrack(int[] candidates, int target, List<List<Integer>> rsList, List<Integer> list, int sum, int index) { if (sum > target) { return; } if (sum == target) { rsList.add(new ArrayList<>(list)); return; } for (int i = index; i < candidates.length; i++) { sum += candidates[i]; list.add(candidates[i]); // 剪枝,因为后面的元素大于当前元素,如果已经大于,则结束本轮 if (sum < target && sum + candidates[i] > target) { sum -= candidates[i]; list.remove(list.size() - 1); continue; } backtrack(candidates, target, rsList, list, sum, i); sum -= candidates[i]; list.remove(list.size() - 1); } } } ``` 最后修改:2022 年 12 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 本作品采用 CC BY-NC-SA 4.0 International License 进行许可。