LeetCode 39. Combination Sum
Description
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.
Example
Code
- java
class Solution {
private List<List<Integer>> result;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
result = new LinkedList<>();
dfs(candidates, 0, 0, new LinkedList<>(), target);
return result;
}
public void dfs(int[] candidates, int cur, int sum, LinkedList list, int target) {
if(cur == candidates.length || sum > target) return;
if(sum == target) {
result.add(new LinkedList<>(list));
return;
}
for(int i = cur; i < candidates.length; i++) {
list.add(candidates[i]);
dfs(candidates, i, sum+candidates[i], list, target);
list.removeLast();
}
}
}
- Others’ Soulution
- java
public List<List<Integer>> combinationSum(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, target, 0);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){
if(remain < 0) return;
else if(remain == 0) list.add(new ArrayList<>(tempList));
else{
for(int i = start; i < nums.length; i++){
tempList.add(nums[i]);
backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elements
tempList.remove(tempList.size() - 1);
}
}
}
Conclusion
- dfs 回溯
- 用减法可以减少一个变量
- List接口有
add
和remove
方法 - LinkedList实现了DeQue有
removeLast
比较快速