组合总和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. OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法

    OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法 公司有一台性能比较好的power机器. 同事要求安装rabbitmq 今天尝试进行了一下处理 公司里面有网络有相应的源 性能 ...

  2. Spring 应用合并之路(二):峰回路转,柳暗花明 | 京东云技术团队

    书接上文,前面在 Spring 应用合并之路(一):摸石头过河 介绍了几种不成功的经验,下面继续折腾- 四.仓库合并,独立容器 在经历了上面的尝试,在同事为啥不搞两个独立的容器提醒下,决定抛开 Spr ...

  3. 【解决了一个小问题】macbook m2 下交叉编译 musl-gcc 支持的 gozstd 库

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我的 golang 项目中使用了 gozstd, 在 ma ...

  4. Fabric配置块结构解析

    本文是区块链浏览器系列的第二篇. 上一篇介绍了交易块中的数据结构,这一篇介绍区块链网络中的配置块数据结构. 这两种区块中数据结构内容的区别主要Payload结构体中的Data域中的内容,接下来将以类图 ...

  5. 关于React-Router6 (React 路由)

    一.概要 (1)每个单页应用其实是一系列的 JS 文件,当用户请求网站时,网站返回一整个(或一系列)的 js 文件和 HTML,而当用户在某个页面内点击时,你需要告诉浏览器怎么加载另一个页面地址.单页 ...

  6. 京豆薅羊毛新姿势-docker方式

    背景 上周看脉脉的时候看到下面这个帖子,领导让搞项目容器化,但是楼主没搞过,对新东西有畏惧感,怂了,然后把机会白白送给其他同事了. 想来我也是差不多这样的,刚到阿里工作的时候,有个好的项目机会来了,领 ...

  7. (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址

    向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...

  8. Python-pymysql操作MySQL数据库

    一.安装pymysql py -m pip install pymysql; 二.pymysql数据库操作 1.简单示例 #coding=utf-8 import pymysql ## 打开数据库连接 ...

  9. NC16590 [NOIP2010]乌龟棋

    题目链接 题目 题目描述 ​ 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. ​ 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数).棋盘第1 格是唯一的起点,第N 格是终点,游戏要求玩家 ...

  10. Linux操作系统下查询NVMe盘符、Slot ID和Bus ID的对应关系

    在拆卸NVMe PCIe 固态硬盘时,需要查询Linux操作系统下NVMe盘符.Slot ID和Bus ID的对应关系. 操作步骤打开操作系统命令终端.依次执行cd /sys/bus/pci/slot ...