不是two sum,所以还是深搜
每个数的搜索深度是它重复的次数,例如有两个1,搜索就是0,1,2三次
其他和combination sum相同
public class Solution {
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {Arrays.sort(num);
return DFS(num,target,0,num.length);
}
public static ArrayList<ArrayList<Integer>> DFS(int[] num, int target,int begin,int end)
{
ArrayList<ArrayList<Integer>> rst=new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> rst_sub=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> rstentry=new ArrayList<Integer>();
ArrayList<Integer> entry_prefix=new ArrayList<Integer>();
int n=end-begin;
if(n==0)
return rst;
if(n==1 && num[begin]==target)
{
rstentry.add(num[begin]);
rst.add(rstentry);
return rst;
}
if(num[begin]>target)
{
return rst;
}
int tmp=num[begin];
int same=1;
for(; begin+1<end && num[begin+1]==tmp;begin++)
same++;
int i=0,j;
while(i<=same)
{
if(i>0)
entry_prefix.add(num[begin]);
if(target-i*num[begin]==0)
{
rst.add(entry_prefix);
break;
}
rst_sub=DFS(num,target-i*num[begin],begin+1,end);
for(j=0;j<rst_sub.size();j++)
{
rstentry=new ArrayList<Integer>();
rstentry.addAll(entry_prefix);
rstentry.addAll(rst_sub.get(j));
rst.add(rstentry);
}
i++;
}
return rst;//*/
}
}