【LeetCode回溯算法#02】组合总和III
组合总和III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]
示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
思路
与组合问题的思路类似,只是条件变了而已
直接上三部曲分析
1、确定递归函数的参数和返回值
这里仍然不需要返回值,因为我们是去操作一个"数组"
参数就是组合的元素个数k,目标相加和target以及控制遍历位置的beginIndex
依然需要两个数组来保存结果
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
//确定递归函数的参数和返回值
void backtracking(int k, int target, int beginIndex){
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
}
};
2、确定终止条件
当遍历到叶子节点时触发终止条件,并判断此时target是否被减为0(这里找符合条件的元素和是通过减法来进行的,详见两数之和)
这里刚开始做容易乱,强调一下,在这个回溯模板中,终止条件一般就是深度,即path大小与k是否相等,相等就终止
(我做的时候还把target == 0
也作为条件一块加上了,实际上是错误的,这个条件对应是否要保存当前path)
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
//确定递归函数的参数和返回值
void backtracking(int k, int target, int beginIndex){
//终止条件
if(path.size() == k){//是否遍历到叶子节点
if(target == 0){
res.push_back(path);
return;
}
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
}
};
3、确定单层处理逻辑
在每层递归中,遍历规定范围内的值,用来与target作差,并保存当前遍历到的路径值
然后触发递归
在回溯过程中,将减掉的值再加回target,并pop掉path中保存的路径值
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
//确定递归函数的参数和返回值
void backtracking(int k, int target, int beginIndex){
//终止条件
if(path.size() == k){//是否遍历到叶子节点
if(target == 0){//若target为0,则当前path中保存的路径值之和满足为n的条件
res.push_back(path);
return;
}
}
//确定单层处理逻辑
for(int i = beginIndex; i <= 9; ++i){
target -= i;//当前路径值与target作差
path.push_back(i);//保存当前路径值
backtracking(k, target, i + 1);//触发下层递归,跳过当前值
//回溯逻辑处理
target += i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
}
};
代码
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
//确定递归函数的参数和返回值
void backtracking(int k, int target, int beginIndex){
//终止条件
if(path.size() == k){//是否遍历到叶子节点
if(target == 0){//若target为0,则当前path中保存的路径值之和满足为n的条件
res.push_back(path);
return;
}
}
//确定单层处理逻辑
for(int i = beginIndex; i <= 9; ++i){
target -= i;//当前路径值与target作差
path.push_back(i);//保存当前路径值
backtracking(k, target, i + 1);//触发下层递归,跳过当前值
//回溯逻辑处理
target += i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 1);
return res;
}
};
【LeetCode回溯算法#02】组合总和III的更多相关文章
- Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)
Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...
- LeetCode ● 216.组合总和III ● 17.电话号码的字母组合
LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class ...
- Java实现 LeetCode 216. 组合总和 III(三)
216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. ...
- 216. 组合总和 III
216. 组合总和 III 题意 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的 ...
- 【JavaScript】Leetcode每日一题-组合总和4
[JavaScript]Leetcode每日一题-组合总和4 [题目描述] 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 targ ...
- LeetCode 216. 组合总和 III(Combination Sum III)
题目描述 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入 ...
- 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题
子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...
- LeetCode HOT 100:组合总和
题目:39. 组合总和 题目描述: 给你一个没有重复元素的数组,和一个target目标值,返回数组中可以使数字和为目标数target的所有不同组合.什么叫组合?组合就是数组中任意数字组成的集合,不需要 ...
- 四种语言刷算法之 组合总和 II
力扣40. 组合总和 II 1.C void back(int* candidates, int candidatesSize, int target,int start,int *path,int ...
- Leetcode 216. 组合总和 III
地址 https://leetcode-cn.com/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并 ...
随机推荐
- [转帖]Linux系统语言设置和locale命令详解
简介 Linux系统可以用locale命令查看语言设置,查看中英文环境,具体操作如下. 操作 1.查看当前安装有那些语言: [root@localhost /]# locale -a 2.当前语言相关 ...
- [转帖]CentOS7完美升级gcc版本方法
https://blog.whsir.com/post-4975.html 在某些应用场景中,需要特定的gcc版本支持,但是轻易不要去编译gcc.不要去编译gcc.不要去编译gcc,我这里推荐使用红帽 ...
- easyUI 实现查询条件中时间默认当天,第一次不参与查询,当点击查询时参与
前端查询条件: 初始加载页面时,不进行调用方法,不加载数据.前端页面代码如下: 初始化datagrid代码如下: 当点击查询时,调用后台方法进行查询数据
- arch linux 安装
好长时间都没有更新自己的博客了,我简单翻阅了一下自己的更新记录,上一次更新好像还是在5月份左右,距今也有快半年,这半年也是遇到了很多事情,有不好的,也有好的.这半年我对在日常生活工作中使用Linux系 ...
- 书写自动智慧文本分类器的开发与应用:支持多分类、多标签分类、多层级分类和Kmeans聚类
书写自动智慧文本分类器的开发与应用:支持多分类.多标签分类.多层级分类和Kmeans聚类 文本分类器,提供多种文本分类和聚类算法,支持句子和文档级的文本分类任务,支持二分类.多分类.多标签分类.多层级 ...
- ROS节点通信(一)消息发布和订阅
目录 1.说明 2.创建工作空间 3.创建功能包 4.编写自定义传输类型文件 5.编写源代码 5.1.编写发布者代码 5.2.编写订阅者代码 6.编译 7.启动运行 8.查看ROS网络结构图 1.说明 ...
- CF1045G AI robots题解
题目链接:洛谷 或者 CF 本题考虑转化为 cdq 分治模型 对于 cdq 分治来说,只需要考虑左边对右边的影响,那我们要考虑该怎样设置第一维度的左右对象.很显而易见的是抛开 \(q\) 限制而言,我 ...
- 错误:基于tensorflow识别mnist数据集出现ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[10000,32,28,28] and type float on
错误:最近,在尝试运行我以前博客代码的时候出现了如下错误 2020-04-03 10:53:22.982491: W tensorflow/core/common_runtime/bfc_alloca ...
- Java商城单体和微服务架构有什么区别
微服务架构 概述 BizSpring移动全端国际化电商平台,是建立在Spring Cloud 基础上的微服务应用,服务化是系统达到一定规模以后的必然选择,主流的互联网公司基本都在迁移到服务化架构. 我 ...
- 下载Apache软件基金的软件和项目(Hadoop相关组件)
一.下载Hadoop相关组件,可以到Apache软件基金的资源目录: Apache 分发目录地址:https://dlcdn.apache.org/ 二.下载软件 方法一:在页面中找到需要下载的软件目 ...