lintcode--数字组合

给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。

例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:

[7],

[2,2,3]

 注意事项
  • 所有的数字(包括目标数字)均为正整数。
  • 元素组合(a1a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
  • 解集不能包含重复的组合。 

样例

给出候选数组[2,3,6,7]和目标数字7

返回 [[7],[2,2,3]]






/*
    十分普通的回溯算法,只是在保存时候,需要剔除相同的以及必须是非降序
    */


// version 2: reuse candidates array
public class Solution {
    public  List<List<Integer>> combinationSum(int[] A, int target) {
        List<List<Integer>> lists = new ArrayList<>();
        if (A == null) {
            return lists;
        }


        List<Integer> list = new ArrayList<>();
        //1.先排序数组
        Arrays.sort(A);
        //2.递归调用
        helper(A, 0, target, list, lists);


        return lists;
    }


    public  void helper(int[] A,
                 int index,//下标计数
                 int target,//目标
                 List<Integer> list,
                 List<List<Integer>> lists) {
                     
        if (target == 0) {
            lists.add(new ArrayList<Integer>(list));//!!
            return;
        }
        for (int i = index; i < A.length; i++) {
            //大于目标值的退出,之后的也不会满足
            if (A[i] > target) {
                break;
            }
            //去除重复
            if (i != index && A[i] == A[i - 1]) {
                continue;
            }
            
            list.add(A[i]);
            helper(A, i, target - A[i], list, lists);
            list.remove(list.size() - 1);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值