Algorithms—40.Combination Sum II

本文介绍了一种使用排序和递归查询相结合的方法来解决组合问题的算法。通过先对候选元素进行排序,然后从后向前取数,判断当前数是否能与目标值相匹配,若不能则继续递归查询剩余元素,以此实现高效的组合搜索。

思路:先排序,然后逆向取数,如果这个数小于目标值,则将该数于目标的差值带入,递归查询。

public class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        return f(candidates,target,candidates.length-1);
    }
    public List<List<Integer>> f(int[] candidates, int target,int l) {
    	List<List<Integer>> ans=new ArrayList<List<Integer>>();
    	if (candidates[0]>target||target<0||l<0) {
			return ans;
		}
    	for (int i =l; i >=0 ; i--) {
			int k=candidates[i];
			if (k==target) {
				List<Integer> list=new ArrayList<Integer>();
				list.add(k);
				ans.add(list);
			}else {
				List<List<Integer>> q=f(candidates,target-k,i-1);
				if (q!=null&&q.size()!=0) {
					for (int j = 0; j < q.size(); j++) {
						List<Integer> list=q.get(j);
						list.add(k);
						ans.add(list);
					}
				}
			}
			while (i>0&&candidates[i]==candidates[i-1]) {
				i--;
			}
		}
    	return ans;
    }
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值