leetcode 39 Combination Sum
z

Given a set of candidate numbers (C) (without duplicates) 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.
  • The solution set must not contain duplicate combinations.

For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:

1
2
3
4
[
[7],
[2, 2, 3]
]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(candidates.length == 0) return ans;
Arrays.sort(candidates);
ArrayList<Integer> t = new ArrayList<Integer>();
backtrack(candidates, target, ans, t, 0);
return ans;
}

public void backtrack(int[] candidates, int target, List<List<Integer>> ans, ArrayList<Integer> t, int start){
if(target == 0){
ans.add(new ArrayList(t));
return ;
}
if(target < 0)
return ;

for(int i=start; i<candidates.length; i++){
if(candidates[i] <= target){
t.add(candidates[i]);
backtrack(candidates, target - candidates[i], ans, t, i);
t.remove(t.size() - 1);
}
}

}
}
  • 在不添加start的情况下,是直接的回溯法
  • 这里要考虑到需要取出重复操作。如果不加上start,会出现 [1,1,2] [2,1,1]同时出现的情况。