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 中的每个数字在每个组合中只能使用一次. ...
随机推荐
- MySQL学习(3)---MySQL常用命令
ps:此随笔基于mysql 5.7.*版本. 准备 net start mysql 启动MySQL服务 net stop mysql 关闭MySQL服务 mysql [-h<IP地址>] ...
- 工厂数字化转型离不开 MES 的原因是什么?
工厂数字化转型是离不开 MES,首先得弄清楚什么是工厂数字化转型.什么是MES,它们的关系是怎样的. 数字化的主要含义是构建"业务数字化.数字资产化.资产服务化.服务业务化"闭环, ...
- mac通过docker一键部署Jenkins
目录 mac通过docker一键部署Jenkins 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.下载脚本 1.2.安装程序 1.2.1.安装程序详情 1 ...
- Docker | 发布镜像到镜像仓库
本文记录发布镜像到 DockerHub 和 阿里云镜像仓库.工作中使用的是JFrog Artifactory 和 Harbor,没有太大差别. 发布镜像到DockerHub https://hub.d ...
- JDK 8之前日期和时间的API
JDK 8之前日期和时间的API(1) System类中的currentTimeMillis():返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差.称为时间戳. java.util ...
- 微信小程序制作日常生活首页
1.手机上效果预览 不知道为啥上传后是如此的高糊画质(手机画质很好) 微信小程序日常生活首页手机效果演示 2.开发者工具效果图 3.真机调试 4.项目的目录结构 5.核心代码 5.1 app.json ...
- Redis 01: 非关系型数据库 + 配置Redis
数据库应用的发展历程 单机数据库时代:一个应用,一个数据库实例 缓存时代:对某些表中的数据访问频繁,则对这些数据设置缓存(此时数据库中总的数据量不是很大) 水平切分时代:将数据库中的表存放到不同数据库 ...
- 三、Kubernetes调度
一.Kubernetes调度 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都 ...
- Linux--多线程(三)
生产者消费者模型 概念: 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过一个来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给 ...
- Python基础之面向对象:1、面向对象及编程思想
一.人狗大战 1.需求 用代码模拟人.狗打架的小游戏 人和狗种类不同,因此双方的属性各不相同 推导一: 人和狗各有不同属性 使用字典方式储存属性较为方便,并可储存多种属性 # 1.在字典内储存'人'属 ...