lintcode--数字组合

来源:互联网 发布:雕刻软件有哪些 编辑:程序博客网 时间:2024/06/05 02:17

给出一组候选数字(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);
        }
    }
}

原创粉丝点击