首页 > 代码库 > LeetCode: Combination Sum 解题报告
LeetCode: Combination Sum 解题报告
Combination Sum
Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Question Solution
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7 and target 7,
A solution set is:
[7]
[2, 2, 3]
SOLUTION 1:
经典递归模板。
i 的起始值是跟排列的最主要区别。因为与顺序无关,所以我们必须只能是升序,也就是说下一个取值只能是i本身或是i的下一个。
但是排列的话,可以再取前同的。1, 2 与2 1是不同的排列,但是同一个组合
同学们可以看下这几个题目的区别。
LeetCode: Letter Combinations of a Phone Number 解题报告
LeetCode: Permutations II 解题报告
LeetCode: Permutations 解题报告
LeetCode: Combinations 解题报告
1 public class Solution { 2 public List<List<Integer>> combinationSum(int[] candidates, int target) { 3 List<List<Integer>> ret = new ArrayList<List<Integer>>(); 4 if (candidates == null || candidates.length == 0) { 5 return ret; 6 } 7 8 // Sort to avoid duplicate solutions. 9 Arrays.sort(candidates);10 11 dfs(candidates, target, new ArrayList<Integer>(), ret, 0);12 return ret;13 }14 15 public void dfs(int[] candidates, int target, List<Integer> path, List<List<Integer>> ret, int index) {16 if (target < 0) {17 return;18 }19 20 if (target == 0) {21 ret.add(new ArrayList(path));22 return;23 }24 25 // i 的起始值是跟排列的最主要区别。因为与顺序无关,所以我们必须只能是升序,也就是说下一个取值只能是i本身26 // 或是i的下一个。27 // 但是排列的话,可以再取前同的。1, 2 与2 1是不同的排列,但是同一个组合28 for (int i = index; i < candidates.length; i++) {29 int num = candidates[i];30 path.add(num);31 32 // 注意,最后的参数是i,不是index!!33 dfs(candidates, target - num, path, ret, i);34 path.remove(path.size() - 1);35 }36 }37 }
GITHUB:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/combination/CombinationSum_1203.java
LeetCode: Combination Sum 解题报告