组合总和

题目描述:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。

  • 解集不能包含重复的组合。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/combination-sum/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法

类似构造一棵多叉树,最大深度为candidates数组的长度,然后获取所有可能的路径,最大路径是由根节点到叶子节点,判断所有的路径之和是否等于target,如果相等,则加到结果集中,最后需要判重,把重复的组合去掉,最后返回。

import java.util.*;

public class LeetCode_039 {
/**
* 穷举法
*
* @param candidates
* @param target
* @return
*/
public static List<List<Integer>> combinationSum(int[] candidates, int target) {
// 结果集
List<List<Integer>> result = new ArrayList<>();
// 所有可能的组合情况
Queue<List<Integer>> allPossibleCombinations = new LinkedList<>();
// 初始化所有的情况
for (int candidate : candidates) {
List<Integer> onePossibleCombination = new ArrayList<>();
onePossibleCombination.add(candidate);
allPossibleCombinations.add(onePossibleCombination);
}
while (!allPossibleCombinations.isEmpty()) {
List<Integer> temp = allPossibleCombinations.poll();
int sum = 0;
for (Integer num : temp) {
sum += num;
}
if (sum == target) {
result.add(temp);
} else if (sum < target) {
for (int candidate : candidates) {
// List复制方法
List<Integer> toAdd = new ArrayList<>(Arrays.asList(new Integer[temp.size()]));
Collections.copy(toAdd, temp);
toAdd.add(candidate);
allPossibleCombinations.add(toAdd);
}
}
} // 去重后的结果
List<List<Integer>> result1 = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
boolean isRepeated = false;
List<Integer> one = result.get(i);
Collections.sort(one);
for (int j = i + 1; j < result.size(); j++) {
List<Integer> two = result.get(j);
Collections.sort(two);
if (one.size() != two.size()) {
continue;
}
boolean equals = true;
for (int x = 0; x < one.size(); x++) {
if (!one.get(x).equals(two.get(x))) {
equals = false;
continue;
}
}
if (equals) {
isRepeated = true;
}
}
if (!isRepeated) {
result1.add(one);
}
} return result1;
} public static void main(String[] args) {
int[] candidates = new int[]{8, 10, 6, 3, 4, 12, 11, 5, 9};
for (List<Integer> integers : combinationSum(candidates, 28)) {
for (Integer integer : integers) {
System.out.print(integer + " ");
}
System.out.println();
}
}
}

【每日寄语】 不要急着让生活给予所有的答案,有时我们需要耐心的等待。相信过程,坦然前行,不负生活,生活也必不负你。

LeetCode-039-组合总和的更多相关文章

  1. Java实现 LeetCode 40 组合总和 II(二)

    40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在 ...

  2. Java实现 LeetCode 39 组合总和

    39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字 ...

  3. LeetCode 中级 - 组合总和II(105)

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

  4. Leetcode 377.组合总和IV

    组合总和IV 给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数. 示例: nums = [1, 2, 3] target = 4 所有可能的组合为: (1, 1, 1, ...

  5. [LeetCode] 39. 组合总和

    题目链接 : https://leetcode-cn.com/problems/combination-sum/ 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ...

  6. Java实现 LeetCode 377 组合总和 Ⅳ

    377. 组合总和 Ⅳ 给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数. 示例: nums = [1, 2, 3] target = 4 所有可能的组合为: (1, 1 ...

  7. Java实现 LeetCode 216. 组合总和 III(三)

    216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. ...

  8. [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)

    39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...

  9. LeetCode 216. 组合总和 III(Combination Sum III)

    题目描述 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入 ...

  10. leetcode 39 组合总和 JAVA

    题目: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制 ...

随机推荐

  1. hive DML 操作

    数据导入 向表中装载数据(Load) 1.语法 load data [local] inpath '数据的 path' [overwrite] into table student [partitio ...

  2. 最大公因数与最小公倍数-gcd&lcm

    一.一些性质 \(gcd(a,b)=gcd(b,a)\) \(gcd(-a,b)=gcd(a,b)\) \(gcd(a,a)=|a|, gcd(a,0)=|a|\) \(gcd(a,1)=1\) \( ...

  3. ABC231H(二分图最小权边覆盖)

    首先将行列分别抽象成 \(h, w\) 个点,每个格子视作连接两个点的一条边,那么问题就转化为了二分图最小权边覆盖问题. 考虑最后答案形如:若干组互不相交的匹配加上其他点连接到匹配内. 于此同时,不在 ...

  4. Firewalld工作区

    firewalld的字符界面管理工具是 firewall-cmd  firewalld默认配置文件有两个:/usr/lib/firewalld/ (系统配置,尽量不要修改)和 /etc/firewal ...

  5. iptables防火墙 (纸是包不住火的,得用水泥)

    iptables防火墙 1.Linux防火墙基础 2.编写防火墙规则 1.Linux防火墙基础 iptables概述: Linux 系统的防火墙: IP信息包过滤系统,它实际上由两个组件netfilt ...

  6. 剑指Offer系列_30_包含min函数的栈

    以空间换时间: package leetcode.sword_to_offfer.day01; import java.util.Stack; /** * 定义栈的数据结构,请在该类型中实现一个能够得 ...

  7. python篇第8天【运算符】

    第7天休息 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以 ...

  8. SQL——with as 临时表

    一.WITH AS的含义    WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是 ...

  9. 使用Sinopia部署私有npm仓库

    使用Sinopia部署私有npm仓库 [root@localhost ~]# hostnamectl set-hostname --static npm-server [root@npm-server ...

  10. 带分数--第四届蓝桥杯省赛C++B/C组

    第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...