39.组合综述
题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
解集不能包含重复的组合。
解题思路
采用回溯法:
采用List<List> lists = new ArrayList<>();存放最终的结果。
ArrayList list=new ArrayList();用于存放每一个可行的结果。
利用回溯:
backtrack(start,candidates,target,list);第一个参数表示从哪个数开始,从数组的start位置开始遍历,找下一个点时,target变成target减去当前的值。
for(int i=start;i<candidates.length;i++){
list.add(candidates[i]);
backtrack(i,candidates,target-candidates[i],list);
list.remove(list.size()-1);
}
终止条件为:当target时说明找到了一个和为target的序列,保存到lists中。
回溯完要将数在list中remove,来换用下一个数。
实现代码
class Solution {
List<List<Integer>> lists = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
//回溯法
if(candidates==null||candidates.length==0||target<0){
return lists;
}
//存放可行的方案
ArrayList<Integer> list=new ArrayList<Integer>();
backtrack(0,candidates,target,list);
return lists;
}
public void backtrack(int start,int[] candidates,int target,ArrayList<Integer> list){
if(target<0){
return ;
}
if(target==0){
lists.add(new ArrayList(list));
}
for(int i=start;i<candidates.length;i++){
list.add(candidates[i]);
backtrack(i,candidates,target-candidates[i],list);
list.remove(list.size()-1);
}
}
}