LeetCode HOT 100:组合总和
题目:39. 组合总和
题目描述:
给你一个没有重复元素的数组,和一个target目标值,返回数组中可以使数字和为目标数target的所有不同组合。什么叫组合?组合就是数组中任意数字组成的集合,不需要连续,组合和顺序无关。这一题中的不同,指的是两个组合中至少一个数字的被选数量不同,例如[2, 3, 3]和[2, 3, 2]就是同一个组合,反之则是不同。
思路:
这道题是很典型的回溯。回溯其实就是穷举,最多加点剪枝优化一下。所以这题思想就很简单,把每个元素不断穷举,判断其和是否达到了target。
步骤:
本题主要是回溯方法怎么写,所以下面步骤是回溯方法的步骤。
曾经看到过一位博主,写的回溯方法模版很好,直接套用。
1、先定义好回溯方法的入参
这一题入参也很简单,数组,还需要凑齐的和,要从哪个下标开始穷举
2、定义好回溯方法后,方法里首先确定回溯结束的条件
这一题回溯结束条件就是:还需要凑齐的和为0了,说明该终止本次回溯了
3、定义好终止条件,下面就是开始穷举,伪代码如下
for (int i = startIndex; i < candidates.length; i++) {
将元素放入数组
迭代回溯方法
将元素从数组中删除,回溯
}
解释:
1、本题使用了回溯模版,可以解决很多类似问题,回溯模版在这里总结一下。这是一个优秀博主的回溯模版,膜拜!
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
代码:
List<List<Integer>> ans;
List<Integer> list;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
ans = new ArrayList<>();
list = new ArrayList<>();
// 从下标0开始,需要凑齐target的数
process(candidates, target, 0);
return ans;
}
// rest:剩下要凑齐的数字
// startIndex:从哪个下标开始,继续拿值尝试
public void process(int[] candidates, int rest, int startIndex) {
// 剩余要凑的数字为0,说明target已经达到了,放进结果集合中
if (rest == 0) {
ans.add(new ArrayList<>(list));
return;
}
// 从startIndex下标开始取值尝试
for (int i = startIndex; i < candidates.length; i++) {
// 如果当前值 > 剩下要凑齐的数字,那这个值就不用考虑了
if (candidates[i] <= rest) {
// 先将值放进数组
list.add(candidates[i]);
// 去递归找剩下要凑齐的rest - candidates[i]值
// 因为每个数可以无限取,所以下次尝试还是从 i 开始,而不是 i + 1
process(candidates, rest - candidates[i], i);
// 将刚才放进去的值删除,回溯
list.remove(list.size() - 1);
}
}
}
LeetCode HOT 100:组合总和的更多相关文章
- 【LeetCode】39. 组合总和
39. 组合总和 知识点:递归:回溯:组合:剪枝 题目描述 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 ...
- Leetcode题目39.组合总和(回溯+剪枝-中等)
题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...
- Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)
Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...
- Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II)
Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使 ...
- LeetCode刷题笔记-回溯法-组合总和问题
题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...
- Java实现 LeetCode 40 组合总和 II(二)
40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在 ...
- Java实现 LeetCode 39 组合总和
39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字 ...
- 图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划
Leetcode组合总和系列--回溯(剪枝优化)+动态规划 组合总和 I 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
- 【JavaScript】Leetcode每日一题-组合总和4
[JavaScript]Leetcode每日一题-组合总和4 [题目描述] 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 targ ...
- LeetCode 中级 - 组合总和II(105)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
随机推荐
- electron 基础
electron 基础 前文我们快速的用了一下 electron.本篇将进一步介绍其基础知识点,例如:生命周期.主进程和渲染进程通信.contextBridge.预加载(禁用node集成).优雅的显示 ...
- 文本数据挖掘---课后作业shuffle函数洗牌C++
题目: 代码如下:#include <iostream> #include <random> #include <algorithm> #include <v ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- C++面向对象编程之虚指针、虚表
1.当编译器看到一个函数调用,有2个考量:静态绑定or动态绑定 静态绑定是"call xxx",xxx 是表示地址,call 是汇编语言的一个动作,它一定会调用到某个地址: 当符合 ...
- 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)
本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...
- oracle 12C 《服务器、客户端安装》
oracle 12C <服务器.客户端安装> 1.下载database和client database和client下载地址:http://www.oracle.com/technetwo ...
- Java斗地主(集合综合练习)
学完了集合后我们可以开始做一个简易版的 " 斗地主 " 了,但是呢咱们这个斗地主只能实现制造牌,洗牌.发牌.看牌这几个简单的功能,并不是我们玩的 " 真人版斗地主 & ...
- 【UML】统一建模语言
如果是准备学习设计模式的同学,可以只了解类图相关的知识 而如果是在准备软件设计师考试的同学,或许会对你有点帮助 正在施工...... 参考博客:https://blog.csdn.net/unique ...
- 【原创】i.MXRT J-Flash烧写算法使能eFuse熔丝位写入
临近年底,终于又憋了一篇文章出来,本来年初的时候是有计划把去年总结的一些东西整理下发布出来的,结果还是被工作和生活上各种琐事给耽搁了.哎,今年刚过了自己35岁的生日,眼瞅着这个人生节点 ...
- iptables入门到精通
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架&qu ...