题目描述:
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.
(给定一组候选数字(C)和一个目标数(T),在C中找出所有唯一的组合使其总和为T。
C中的每个数字只能在组合中使用一次。
注:
所有数字(包括目标)都是正整数。
解决方案集不得包含重复组合。)
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]
]
思路:这个题和Combination_Sum几乎完全一样,只不过这个允许有重复的元素,以及每个元素只能用一次,所以要在for循环里进行一个重复元素的判断,以及在元素的抽取上不能抽原来已经抽取过的元素。
public class Combination_Sum_II {
public static List<List<Integer>> combinationSum2(int[] candidates, int target)
{
List<List<Integer>> result = new ArrayList();
if(target==0||candidates.length==0)
return result;
Arrays.sort(candidates);
List<Integer> mid = new ArrayList<Integer>();
solve(result,mid,candidates,target,0);
return result;
}
public static void solve(List<List<Integer>> result,List<Integer> mid,int[] candidates,int target,int index)
{
if(target==0)
{
result.add(new ArrayList(mid));
}
else
{
if(target<0)
return;
//i是指第i个元素
for(int i=index;i<candidates.length;i++)
{
if(i>index && candidates[i]==candidates[i-1])
continue;
mid.add(candidates[i]);
solve(result,mid,candidates,target-candidates[i],i+1);
mid.remove(mid.size()-1);
}
}
}
public static void main(String[] args) {
int candidates[] = {10, 1, 2, 7, 6, 1, 5};
int target = 8;
List<List<Integer>> result = combinationSum2(candidates,target);
for(int i=0;i<result.size();i++)
{
for(int j=0;j<result.get(i).size();j++)
{
System.out.print(result.get(i).get(j)+" ");
}
System.out.println("\n");
}
}
}