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 1:
Input: candidates =[2,3,6,7],
target =7
, A solution set is: [ [7], [2,2,3] ]
Example 2:
Input: candidates = [2,3,5],
target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
dfs加一层for循环,判断加入下一个数的位置,这样就可以避免重复
或者在等于target的时候也return
class Solution:
def combinationSum(self, a, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
res,path=[],[]
def dfs(i,s):
if s==target:
res.append(list(path))
return
if s>target: return
if i==len(a): return
path.append(a[i])
dfs(i,s+a[i])
path.pop()
if i+1<len(a):
dfs(i+1,s)
dfs(0,0)
return res
class Solution:
def combinationSum(self, a, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
a.sort()
res,path=[],[]
def dfs(i,s):
if s>target: return
if s==target: res.append(list(path))
for j in range(i,len(a)):
path.append(a[j])
dfs(j,s+a[j])
path.pop()
dfs(0,0)
return res
s=Solution()
print(s.combinationSum([2,3,6,7], 7))
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
排序 + DFS
注意要去掉重复部分,
if(i != start && candidates[i] == candidates[i-1]) continue;
注意不是
if(i != 0 && candidates[i] == candidates[i-1]) continue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
List<List<Integer>> rst = new ArrayList<List<Integer>>();
List<Integer> t = new ArrayList<Integer>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
dfs(candidates, 0, target);
return rst;
}
private void dfs(int[] candidates, int start, int target) {
if(target == 0) {
List<Integer> temp = new ArrayList<Integer>(t);
rst.add(temp);
return;
}
if(target < 0) return;
for(int i=start; i<candidates.length; i++) {
if(i != start && candidates[i] == candidates[i-1]) continue;
t.add(candidates[i]);
dfs(candidates, i+1, target-candidates[i]);
t.remove(t.size()-1);
}
}
}