龙空技术网

35.算法学习之组合总数‖

躲了一辈子的雨 14

前言:

而今看官们对“求组合数的代码是多少”可能比较重视,兄弟们都想要了解一些“求组合数的代码是多少”的相关资讯。那么小编在网络上收集了一些有关“求组合数的代码是多少””的相关资讯,希望看官们能喜欢,你们一起来学习一下吧!

题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。

说明: 解集不能包含重复的组合

示例:

输入: candidates = [10,1,2,7,6,1,5], target = 8

所求解集为:

[

[1, 7],

[1, 2, 5],

[2, 6],

[1, 1, 6]

]

我的思路: 该题目和上一个题目一样,是求的全排列。 但和上一题要求不同的是,该题目的输入数组存在重复数据,而且每个元素只能被选取一次,当然结果集也不能有重复。那么我们这个题目该怎么做呢? 可以参考33题的去重思想(有相同值的元素,每个元素只能被选取一次) 和34题结果集不重复的思路。 我们的代码如下:

public static List<List<Integer>> combinationSum3(int[] candidates, int target) {        Arrays.sort(candidates);        List<List<Integer>> res = new ArrayList<>();        back3(candidates, target, 0, new boolean[candidates.length], new ArrayList<>(), res);        return res;    }    public static void back3(int[] candidates, int target, int cur, boolean[] used, List<Integer> pick, List<List<Integer>> res) {        if (target == 0) {            res.add(new ArrayList<>(pick));            return;        }        if (pick.size() == candidates.length || cur == candidates.length) {            return;        }        for (int i = cur; i < candidates.length; i++) {            //相同元素每个元素选取一次            if (used[i] || (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1])) {                continue;            }            //减枝            if (target - candidates[i] >= 0) {                used[i] = true;                pick.add(candidates[i]);                back3(candidates, target - candidates[i], i + 1, used, pick, res);                used[i] = false;                pick.remove(pick.size() - 1);            } else {                //因为数组是排序过的, 若走到这一步,说明后面数字肯定更大,直接返回                break;            }        }    }

以上就是我的代码了。当然,大佬们有其他解法也可以指点一下。谢谢!

如果对您有帮助,帮忙点个赞呐~ : )

标签: #求组合数的代码是多少