题目描述:
Given a collection of candidate numbers (candidates
) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
Each number in candidates
may only be used once in the combination.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates =[10,1,2,7,6,1,5]
, target =8
, A solution set is: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
Example 2:
Input: candidates = [2,5,2,1,2], target = 5, A solution set is: [ [1,2,2], [5] ]
中文理解:
给定一个数组和指定值,每个数组中值只可以使用一次,给出数组中所有和为指定值的所有序列。
解题思路:
使用回溯方法,其中注意去除重复的数组元素。
代码(java):
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list=new ArrayList();
Arrays.sort(candidates);
backtrack(list,new ArrayList<>(),candidates,target,0);
return list;
}
public void backtrack(List<List<Integer>> list,List<Integer> tempList,int []nums,int remain,int start){
if(remain<0)return;
else if(remain==0)list.add(new ArrayList<>(tempList));
else{
for(int i=start;i<nums.length;i++){
if(i>start && nums[i]==nums[i-1])continue;//跳过重复的
tempList.add(nums[i]);
backtrack(list,tempList,nums,remain-nums[i],i+1);
tempList.remove(tempList.size()-1);
}
}
}
}