问题
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
例子
思路
- 回溯
代码
class Solution {
public List<List<Integer>> combinationSum2(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<>();
//先排序 防止{1,1,2,1} 4 [1,1,2] [2,1,1]的出现
Arrays.sort(nums);
get(nums,list,new ArrayList<Integer>(),target,0);
return list;
}
public void get(int[] nums, List<List<Integer>> list, List<Integer> temp_list, int target, int start) {
int sum=0;
for(int n: temp_list) sum+=n;
if(sum>target) return;
if(sum==target) {
if(!list.contains(temp_list))
list.add(new ArrayList<Integer>(temp_list));
}
else{
for(int i=start; i<nums.length; i++) {
temp_list.add(nums[i]);
get(nums,list,temp_list,target,i+1);
temp_list.remove(temp_list.size()-1);
}
}
}
}