Combination Sum II

来源:互联网 发布:怎么下载天人网络电视 编辑:程序博客网 时间:2024/05/29 11:19

不是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;//*/
}
   
}
0 0
原创粉丝点击