给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
39题,回溯+剪枝
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
int len = candidates.length ;
List<List<Integer>> ans = new ArrayList<>();
Deque<Integer> path = new ArrayDeque<>();
Arrays.sort(candidates);
dfs(candidates,len,target,0,path,ans);
return ans ;
}
public void dfs(int[] candidates,int length,int target,int begin,
Deque<Integer> path,List<List<Integer>> ans){
if(target == 0){
ans.add(new ArrayList<>(path));
return ;
}
for(int i = begin ; i < length ; i ++){
if(target < candidates[i]){
break ;
}
path.addLast(candidates[i]);
dfs(candidates,length,target-candidates[i],i,path,ans);
path.removeLast();
}
}
}
接下来是40题,唯一的不同是,不能用相同的元素。
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
int len = candidates.length ;
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(candidates);
Deque<Integer> path = new ArrayDeque<>();
dfs(candidates,len,target,0,path,ans);
return ans ;
}
public void dfs(int[] candidates,int len,int target,int begin,Deque<Integer> path,List<List<Integer>> ans){
if(target == 0){
ans.add(new ArrayList<>(path));
return ;
}
for(int i = begin ; i < len ; i ++){
if(target < candidates[i]){
break ;
}
if(i > begin && candidates[i] == candidates[i-1] ){
continue ;
}
path.addLast(candidates[i]);
dfs(candidates,len,target-candidates[i],i+1,path,ans);
path.removeLast();
}
}
}
递归的思想。还是要多练习啊,怎么去重什么的。