Combination Sum II

本文介绍了一种解决组合求和问题的深度优先搜索算法,该算法通过排序和限制重复元素的搜索深度来避免重复解。适用于目标值匹配问题,特别针对包含重复数字的情况进行了优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不是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;//*/
}
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值