题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
解题思路
采用回溯法:采用一个stack添加一个小于目标数的数组元素,同时将目标数替换为目标数与数组元素的差。进行遍历迭代。首先采用for循环遍历数组元素,将遍历后产生的list与target作为下一次迭代的初始值,同时将当前遍历元素下表加1使数组中的元素在list中只出现一次。
代码:
class Solution {
public List<List<Integer>> biglist = new ArrayList<List<Integer>>();
public int[] candidates;
public int len;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
int len = candidates.length;
if (len == 0) {
return biglist;
}
Arrays.sort(candidates);
this.len = len;
this.candidates = candidates;
combination(target,new Stack<Integer>(),0);
return biglist;
}
public void combination(int target,Stack<Integer> list,int start){
if(target==0&&!biglist.contains(new ArrayList<Integer>(list))){
//if (target == 0){
biglist.add(new ArrayList<Integer>(list));
return;}
for(int i=start;i < candidates.length&&target - candidates[i] >= 0;i++){
list.add(candidates[i]);
combination(target-candidates[i],list,i+1);
list.pop();
}
}
}
来源:CSDN
作者:elephantdees
链接:https://blog.csdn.net/qq_30193541/article/details/104573609