39. 组合总和

直接暴力思路,用dfs+回溯枚举所有可能组合情况。难点在于每个数可取无数次。

我的枚举思路是:

外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(candidates)终止。

然后内层就可以dfs搜索了,

缕清状态的转换与回溯,题就做出来了。

dfs的状态函数:dfs(int k, int i, int[] candidates, List now, int nowCnt, int target, List<List> ans)

k 代表当前状态下还能拿k个数

i 代表已经搜到了数组candidates中的第i个数

now 代表当前已经拿的数的list

nowCnt 代表当前状态下的和

由此可见,当k0且nowCnttarget时,表示已经搜到一个解了,此时把解add到ans即可

class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> ans = new ArrayList<>();
if (candidates.length == 0) return new ArrayList<>();
Arrays.sort(candidates);
int maxCnt = target / candidates[0] + 1;
for (int k = 1; k < maxCnt; k++) {
dfs(k, 0, candidates, new ArrayList<>(), 0, target, ans);
}
return ans;
} public void dfs(int k, int i, int[] candidates, List<Integer> now, int nowCnt, int target, List<List<Integer>> ans) {
if (nowCnt > target) {
return;
}
if (k == 0 && nowCnt == target) {
ans.add(new ArrayList<>(now));
return;
}
if (i >= candidates.length) return;
int num = candidates[i];
int max = target / num;
max = Math.min(max, k);
for (int j = 0; j <= max; j++) {
if (nowCnt + j * num > target) {
break;
}
for (int q = 1; q <= j; q++) {
now.add(num);
}
dfs(k - j, i + 1, candidates, now, nowCnt + j * num, target, ans);
for (int q = now.size() - 1; q >= 0; q--) {
if (now.get(q) == num) {
now.remove(q);
}
}
} }
}

[leetcode] 39. 组合总和(Java)(dfs、递归、回溯)的更多相关文章

  1. leetcode 39 组合总和 JAVA

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

  2. [leetcode] 37. 解数独(Java)(dfs,递归,回溯)

    37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...

  3. Java实现 LeetCode 39 组合总和

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

  4. [LeetCode] 39. 组合总和

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

  5. leetcode 39. 组合总和(python)

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

  6. LeetCode——39. 组合总和

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

  7. LeetCode 39. 组合总和(Combination Sum)

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

  8. 【LeetCode】39. 组合总和

    39. 组合总和 知识点:递归:回溯:组合:剪枝 题目描述 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数  ...

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

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

随机推荐

  1. php图片合成【png图片】

    php 图片合成[png图片] 示例代码 <?php header("Content-type:text/html;charset=utf-8"); error_report ...

  2. hdu4756 最小树+树形dp

    题意:       给你一个完全图,让你在上面找到一颗最小树,然后问破坏这个最小树的某一条边后用其他边连接(要求最小)成新的树,然后输出破坏每一条边后最小树中最大的那个. 思路:       先跑出一 ...

  3. Python中数据的排序

    目录 列表的排序 sort(key,reverse)方法 sorted(target,key,reverse) 函数 元组tuple的排序 sort(key,reverse)方法 sorted(tar ...

  4. (翻译)Attacking Interoperability(攻击互操作性)in Black Hat 2009 研究报告

    前言 攻击互操作性(Attacking Interoperability)是 Mark & Ryan & David 发表于 2009 年的美国黑帽大会(Black Hat)上的一份研 ...

  5. 获取Shell后的操作

    对于Windows系统主机和Linux系统主机,获取Shell后的操作都不同. Windows 当我们通过对Web服务器进行渗透,拿到了该Web服务器的shell后,可以执行系统命令后,我们该如何操作 ...

  6. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  7. 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...

  8. .NET之API版本控制

    1. 优点 有助于保护原有系统,不受影响,并及时修改问题 可以实现用户的私人定制(比如是付费接口) 快速迭代 2. API版本控制 在URL中追加版本或者作为查询字符串参数 通过自动以标头和通过接受标 ...

  9. MySQL查看及杀掉链接方法大全

    前言: 在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接.有多少活跃链接.有没有执行时间过长的链接等.数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿 ...

  10. Kafka万亿级消息实战

    一.Kafka应用 本文主要总结当Kafka集群流量达到 万亿级记录/天或者十万亿级记录/天  甚至更高后,我们需要具备哪些能力才能保障集群高可用.高可靠.高性能.高吞吐.安全的运行. 这里总结内容主 ...