题目描述:
给定一个无重复元素的数组
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。- 解集不能包含重复的组合。
示例:
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
分析:回朔法+深拷贝求解。
代码:
class Solution {
public List> combinationSum(int[] candidates, int target) {
List> result = new ArrayList<>();
List list = new ArrayList<>();
Arrays.sort(candidates);
combinationHelper(result,list,candidates,target,0);
return result;
}
private void combinationHelper (List> result,List list,
int[] candidates,int target,int i){
if(target < 0){
return;
}else if(target == 0){
result.add(list);
return;
}else{
for(int j=i; j tmp=new ArrayList<>(list);
tmp.add(candidates[j]);
combinationHelper(result,tmp,candidates,target-candidates[j],j);
}
}
}
}
题目描述:
给定一个数组
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 :
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
分析:(同上题)回朔法+深拷贝求解。
代码:
class Solution {
public List> combinationSum2(int[] candidates, int target) {
List> result = new ArrayList<>();
List list = new ArrayList<>();
Arrays.sort(candidates);
combinationHelper(result,list,candidates,target,0);
return result;
}
private void combinationHelper(List> result,
List list,int[] candidates,
int target,int i){
if(target < 0){
return;
}else if(target == 0){
if(!result.contains(list)){//去重
result.add(list);
}
return;
}else{
for(int j=i; j tmp = new ArrayList<>(list);
tmp.add(candidates[j]);
combinationHelper(result,tmp,candidates,
target-candidates[j],j+1);
}
}
}
}