Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
解题思路:
这道题跟39那道题基本思路是一样的,就是在39里面数组中的数是不重复的,但是可以重复使用数组中的数。这道题里面数组中的数是有重复的,但是不能重复使用数组中的数。
代码上进行一定修改就可以了。就是每次将当前数放到list中之后,递归的index变为index+1。
还有一个就是在遍历当前数组的数的时候,如果当前数的值与前一个数的值相等时,跳过。
public class Solution {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum2(int[] candidates, int target)
{
Arrays.sort(candidates);
findanswer(0,new ArrayList<Integer>(),candidates,target);
return result;
}
public void findanswer(int index,List<Integer>ans,int[] candidates,int target)
{
while(index < candidates.length && candidates[index]<= target)
{
if(candidates[index] <= target/2)
{
List<Integer> l1 = new ArrayList<Integer>(ans);
l1.add(candidates[index]);
//index从变为index+1
findanswer(index+1,l1,candidates,target-candidates[index]);
}
if(candidates[index] == target)
{
List<Integer> l1 = new ArrayList<Integer>(ans);
l1.add(candidates[index]);
result.add(l1);
}
//当下一个数与当前数相同时,跳过
while(++index < candidates.length && candidates[index] == candidates[index-1]);
}
}
}