From 1c87243cb1f5d8ce096dbcfebbb247639c11f95f Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Mon, 2 Aug 2021 16:26:03 +0800 Subject: [PATCH] =?UTF-8?q?39:=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leetcode/editor/cn/CombinationSum.java | 107 ++++++++++++++++++ .../java/leetcode/editor/cn/CombinationSum.md | 53 +++++++++ 2 files changed, 160 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/CombinationSum.java create mode 100644 src/main/java/leetcode/editor/cn/CombinationSum.md diff --git a/src/main/java/leetcode/editor/cn/CombinationSum.java b/src/main/java/leetcode/editor/cn/CombinationSum.java new file mode 100644 index 0000000..9126c51 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/CombinationSum.java @@ -0,0 +1,107 @@ +//给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的 +//唯一组合。 +// +// candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。 +// +// 对于给定的输入,保证和为 target 的唯一组合数少于 150 个。 +// +// +// +// 示例 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]] +// +// 示例 3: +// +// +//输入: candidates = [2], target = 1 +//输出: [] +// +// +// 示例 4: +// +// +//输入: candidates = [1], target = 1 +//输出: [[1]] +// +// +// 示例 5: +// +// +//输入: candidates = [1], target = 2 +//输出: [[1,1]] +// +// +// +// +// 提示: +// +// +// 1 <= candidates.length <= 30 +// 1 <= candidates[i] <= 200 +// candidate 中的每个元素都是独一无二的。 +// 1 <= target <= 500 +// +// Related Topics 数组 回溯 +// 👍 1458 👎 0 + +package leetcode.editor.cn; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +//39:组合总和 +public class CombinationSum { + public static void main(String[] args) { + //测试代码 + Solution solution = new CombinationSum().new Solution(); + solution.combinationSum(new int[]{2, 3, 6, 7}, 7); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> list = new ArrayList<>(); + boolean bl = false; + + public List> combinationSum(int[] candidates, int target) { + Arrays.sort(candidates); + backtrack(candidates, 0, new ArrayList<>(), 0, target); + return list; + } + + private void backtrack(int[] candidates, int index, List use, int sum, int target) { + if (sum == target) { + list.add(new ArrayList<>(use)); + bl = true; + return; + } + if (sum > target) { + bl = true; + return; + } + + for (int i = index; i < candidates.length; i++) { + use.add(candidates[i]); + backtrack(candidates, i, use, sum + candidates[i], target); + use.remove(use.size() - 1); + if(bl){ + break; + } + } + bl = false; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/CombinationSum.md b/src/main/java/leetcode/editor/cn/CombinationSum.md new file mode 100644 index 0000000..ca6b7e9 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/CombinationSum.md @@ -0,0 +1,53 @@ +

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

+ +

candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。 

+ +

对于给定的输入,保证和为 target 的唯一组合数少于 150 个。

+ +

 

+ +

示例 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]]
+ +

示例 3:

+ +
+输入: candidates = [2], target = 1
+输出: []
+
+ +

示例 4:

+ +
+输入: candidates = [1], target = 1
+输出: [[1]]
+
+ +

示例 5:

+ +
+输入: candidates = [1], target = 2
+输出: [[1,1]]
+
+ +

 

+ +

提示:

+ +
    +
  • 1 <= candidates.length <= 30
  • +
  • 1 <= candidates[i] <= 200
  • +
  • candidate 中的每个元素都是独一无二的。
  • +
  • 1 <= target <= 500
  • +
+
Related Topics
  • 数组
  • 回溯
  • \n
  • 👍 1458
  • 👎 0
  • \ No newline at end of file