Combination Sum

来源:互联网 发布:淘宝隐形眼镜可以买吗 编辑:程序博客网 时间:2024/05/17 09:07

1.题目

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

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

[7],  [2,2,3]

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

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

2.算法

这道题也是问题,方法仍然是N-Queens中介绍的套路。基本思路是先排好序,然后每次递归中把剩下的元素一一加到结果集合中,并且把目标减去加入的元素,然后把剩下元素(包括当前加入的元素)放到下一层递归中解决子问题,应为允许元素重复,我们在递归下一个数的时候,还可以用当前数

    public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {        // write your code here        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();        if (candidates == null || candidates.length == 0) {        return res;        }        Arrays.sort(candidates);        helper(candidates, 0, target, new ArrayList<Integer>(), res);        return res;    }    public void helper(int[] candidates, int start, int target, ArrayList<Integer> item, ArrayList<ArrayList<Integer>> res)    {    if (target < 0)    {    return;    }    if (target == 0)    {    res.add(new ArrayList<Integer>(item));    return;    }    for (int i = start; i < candidates.length; i++)    {    if (i > 0 && candidates[i] == candidates[i - 1])    {    continue;    }    item.add(candidates[i]);    helper(candidates, i, target - candidates[i], item, res); //从第i个开始,可以重复数子    item.remove(item.size() - 1);    }    }


0 0
原创粉丝点击