39. Combination Sum
题目
Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
The same repeated number may be chosen from candidates unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
- 所有数字(包括 target)都是正整数。
- 解集不能包含重复的组合。
Example
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
解法
递归回溯
代码
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
if(candidates.length == 0)
return res;
Arrays.sort(candidates);
List<Integer> list = new ArrayList<>();
func(res, list, candidates, 0,target);
return res;
}
public void func(List<List<Integer>> res, List<Integer> list, int[] candidates, int start, int target) {
for(int i = start; i < candidates.length; i++) {
if(target > candidates[i]) {
list.add(candidates[i]);
func(res, list, candidates, i, target-candidates[i]);
list.remove(list.size()-1);
}
else if(target == candidates[i]) {
list.add(candidates[i]);
res.add(new ArrayList<>(list)); // 要new一个list,而不是直接插入list
list.remove(list.size()-1);
return;
}
else
return;
}
}
执行用时 : 19 ms, 在Combination Sum的Java提交中击败了72.12% 的用户
内存消耗 : 42.8 MB, 在Combination Sum的Java提交中击败了2.34% 的用户
40. Combination Sum II
题目
Given a collection of candidate numbers (candidates) and a target number (target), find all unique >combinations in candidates where the candidate numbers sums to target.
Each number in candidates may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
Example
Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
[1,2,2],
[5]
]
解法
在39题的基础上,每次从第i+1个位置递归,并且去重
代码
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
if(candidates.length == 0)
return res;
Arrays.sort(candidates);
List<Integer> list = new ArrayList<>();
func(res, list, candidates, 0,target);
return res;
}
public void func(List<List<Integer>> res, List<Integer> list, int[] candidates, int start, int target) {
for (int i = start; i < candidates.length; i++) {
if (target > candidates[i]) {
list.add(candidates[i]);
func(res, list, candidates, i + 1, target - candidates[i]);
list.remove(list.size() - 1);
// 去重
while(i < candidates.length-1 && candidates[i] == candidates[i+1])
i++;
} else if (target == candidates[i]) {
list.add(candidates[i]);
res.add(new ArrayList<>(list));
list.remove(list.size() - 1);
return;
} else
return;
}
}
执行用时 : 19 ms, 在Combination Sum II的Java提交中击败了78.40% 的用户
内存消耗 : 40.7 MB, 在Combination Sum II的Java提交中击败了2.85% 的用户