【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 的正整数,并 ...
随机推荐
- [转帖]AnolisOS8安装ntp同步时间
https://www.wlnmp.com/post-673.html 在AnolisOS8中默认不再支持ntp软件包,时间同步将由chrony来实现,如果你习惯了使用ntp来同步时间,一时难以去适应 ...
- mysql8 CentOS7 简要安装说明
1. 卸载mariadb rpm -qa |grep mariadb |xargs yum remove -y比较简单的卸载办法. 2. 安装所有的rpm包. yum localinstall *.r ...
- mysql8 initialize 命令 初学版 lower_case_table_names
1. 今天开发找我跟我说 我安装的mysql 不对. 比较蛋疼. 需要修改一个参数 但是数据库已经初始进去了 重装起来比较麻烦. 硬着头皮搞. 2. 参数的名字为: lower_case_tabl ...
- VCSA 添加新管理用户的方法
VCSA 6.7 添加单独虚拟机管理员账户的方法 最近一次护网工作中,要求升级vCenter的版本, 所以比较无奈进行了相关的升级和设置, 管理员的分发与之前的vcenter的不太一致, 这里面简单记 ...
- 【DP】DMOPC '21 Contest 8 P5 - Tree Building
Problem Link 给定 \(n,m\) 和一个长为 \(m\) 的代价序列,对于一棵 \(n\) 个节点,每个节点度数不超过 \(m\) 的树,定义它的代价为 \(\sum\limits_{i ...
- vuex中action中发送数据
state: { actionData: "", }, mutations: { actioncomAPi: (state, data) => { state.actionD ...
- LINQ分组排序后获取每组第一条记录
当前有一张数据表{Student},包含了如下的字段信息: CREATE TABLE [dbo].[Student]( [Sno] [nchar](7) NOT NULL, [Sname] [ncha ...
- vim 从嫌弃到依赖(18)——查找模式进阶
上一篇文章中,我们初步结识了如何使用查找模式,也能够通过n和 N进行查找.这篇将会介绍搜索中更高级的用法.另外在写上一篇文章的时候我发现介绍查找相关内容的时候不能用动图来演示,主要是因为输入的内容太多 ...
- 【二】tensorflow调试报错、TF深度学习强化学习教学
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- RabbitMQ基础学习Full版
RabbitMQ 消息队列在软件中的应用场景 异步处理上(优于原先的方式) 为什么优于呢? 首先,通常情况下,如上图我们其实不用消息队列的情况下,其实也可以不用100ms,不用allof即可 那么优势 ...