39. 组合总和

题目:https://leetcode-cn.com/problems/combination-sum/submissions/

代码:

class Solution {

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        return this.handle(candidates, target, target);
    }

    private List<List<Integer>> handle(int[] candidates, int target, int maxCandidate) {
        List<List<Integer>> res = new ArrayList<>();
        for (int c : candidates) {
            if (c > maxCandidate) {
                //避免重复组合
                continue;
            }
            if (c == target) {
                //刚好相等,这个数直接是结果
                List<Integer> list = new ArrayList<>();
                list.add(c);
                res.add(list);
            } else if (c < target) {
                //小于,递归
                List<List<Integer>> lists = this.handle(candidates, target - c, c);
                for (List<Integer> list : lists) {
                    list.add(c);
                }
                res.addAll(lists);
            }
        }
        return res;
    }

}

题目的意思其实就是把target这个数分解成candidates数组中的数,使用递归的做法即可实现,具体实现可以参考代码。

一个需要注意的点是为什么我递归的函数要增加一个maxCandidate的参数,这个参数主要的作用是用来组合去重。参考如下这么一个例子:

candidates=[2,3,6,7],target=7。

没有使用maxCandidate参数去重的话,得出结果为:[[3, 2, 2], [2, 3, 2], [2, 2, 3], [7]]。可以看到存在重复的组合,如果我们增加了maxCandidate参数结合代码中红色部分,那么我们可以控制组合结果一定是按照从小到大排列的,从而实现了去重效果,还去掉了多余的递归操作。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍