组合总和III

力扣题目链接(opens new window)

找出所有相加之和为 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的更多相关文章

  1. Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)

    Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...

  2. LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

    LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class ...

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

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

  4. 216. 组合总和 III

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

  5. 【JavaScript】Leetcode每日一题-组合总和4

    [JavaScript]Leetcode每日一题-组合总和4 [题目描述] 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 targ ...

  6. LeetCode 216. 组合总和 III(Combination Sum III)

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

  7. 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题

    子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...

  8. LeetCode HOT 100:组合总和

    题目:39. 组合总和 题目描述: 给你一个没有重复元素的数组,和一个target目标值,返回数组中可以使数字和为目标数target的所有不同组合.什么叫组合?组合就是数组中任意数字组成的集合,不需要 ...

  9. 四种语言刷算法之 组合总和 II

    力扣40. 组合总和 II 1.C void back(int* candidates, int candidatesSize, int target,int start,int *path,int ...

  10. Leetcode 216. 组合总和 III

    地址 https://leetcode-cn.com/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并 ...

随机推荐

  1. [官网]Apache Log4j2 最新版安全提示 2.17.0

    https://logging.apache.org/log4j/2.x/ 最近一个周的时间 log4j2 从 2.14 跃升到了2.17 还在不停的升级 安全问题正是焦头烂额 free softwa ...

  2. 2024年最新的Python操控微信教程

    自从微信禁止网页版登陆之后,itchat 库实现的功能也就都不能用了,那现在 Python 还能操作微信吗?答案是:可以! 在Github上有一个项目叫<WeChatPYAPI>可以使用 ...

  3. kettle(docker版)系列文章01---docker部署

    1.准备好kettle的镜像文件放在指定目录解压 docker image load -i /home/pdi/jztwebspoon.tar 2.起容器 docker run -d -p 7777: ...

  4. C# MVC+NHibernate 分页

    一.页面代码,分为三部分,一是查询条件部分,二是数据部分,二是页码条 <div id="ticketoutquery"> <table> <tr> ...

  5. 修改U盘图标

    效果如下 方法如下 首先,您需要准备一张您想要设置的图标,它应该是一个512 x 512像素大小的PNG格式图片,其他的也无所谓建议512x512 将U盘插入电脑.确保它已被正确识别并显示在文件资源管 ...

  6. uni-app 实现下拉刷新功能

    我们在运用uni-app开发小程序或h5时,常常需要页面实现下拉刷新功能. 在 js 中定义 onPullDownRefresh 处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事 ...

  7. 深入浅出Java多线程(二):Java多线程类和接口

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第二篇内容:Java多线程类和接口.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代计算机系统中,多线程 ...

  8. 解决idea登录github出现的invalid authentication data 404 not found以及登录 token 失效

    0.错误提醒: Your token is invalid, please re-login github and get token again. 报错无效的用户名(invalid username ...

  9. [Go] string、int、int64相互转换

    import "strconv" //先导入strconv包 // string到int int, err := strconv.Atoi(string) // string到in ...

  10. powerDesigner 逆向工程 mysql 生成 PDM

     1. 信息补充说明 powerDesigner  16.5 mysql 5.6 主要内容:使用powerDesigner的逆向工程,将mysql中的数据库转换成PDM文件 所需资源: powerDe ...