C国演义 [第三章]
第三章
- 组合
- 分析
- 步骤
- 递归函数的返回值和参数
- 递归结束的条件
- 单层逻辑
- 组合总和 III
组合
力扣链接
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
- 提示:
1 <= n <= 20
1 <= k <= n
分析
暴力解法当然是用 for循环 :
n = 4, k = 2时:
int n = 4;
for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cout << i << " " << j << endl;}
}
n = 100, k = 3时:
int n = 100;
for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {for (int u = j + 1; u <= n; n++) {cout << i << " " << j << " " << u << endl;}}
}
如果 k = 50呢? 就要用50个for循环. 有一个问题; 我们如何控制 50 个for循环呢
为了解决这种情况: 我们采用 回溯
回溯也是一种暴力, 但是可以用递归次数来解决for循环的层数
🗨️它是如何解决for循环的层数呢?
- 递归里面套用for循环 — — 每一次递归套用一个for循环, 那么我们解决递归的层数来控制for循环的层数
过程是非常抽象的, 但是递归的过程可以用 二叉树来做一个形象的理解

先看一个分支(纵向):
集合是 [1, 2, 3, 4], 从中任选一个 , 以取 1 为例子
然后集合是 [2, 3, 4], 从中任选一个就已经达到目标了, [1, 2], [1, 3], [1, 4]
集合是[1, 2, 3, 4], 从中任选一个, 以取 2 为例子
然后集合是 [3, 4], 从中任选一个就已经达到目标了, [2, 3], [2, 4]
集合是[1, 2, 3, 4], 从中任选一个, 以取 3为例子
然后集合是[ 4 ], 从中任选一个就已经达到目标了, [3, 4]
集合是[1, 2, 3, 4], 从中任选一个, 以取 4为例子
然后集合是[ ], 就不能继续递归下去了
🗨️为啥集合是 [1, 2, 3, 4], 取 2, 然后剩余集合是 [3, 4]. 为啥不是[1. 3. 4 ]?
- 因为求的是
组合, 所以不用注意相同数值的顺序
如果剩余集合是 [1, 3, 4], 那么叶子结点就是 [2, 1], [2, 3], [2, 4]
这个时候, [1, 2] 和 [2, 1] 是重复的
⇒所以我们需要一个变量来控制下一层递归的开头
每次从集合中选取元素, 下一层递归的范围随着选取元素而缩减
步骤
递归函数的返回值和参数
一般回溯的返回值都是 void, 除非有特殊要求
需要定义两个全局变量, 一个来记录单层结果, 一个来记录全部结果
vector<int> path; // 记录单层结果
vector<int<vector<int>> result; // 记录全部结果
虽然这两个变量也可以放在参数列表里面, 但是这会导致参数列表过于冗杂, 而看不清回溯的逻辑
数组大小n 和 结果大小k 肯定是在参数列表中的
为了避免结果有重复的, 需要有一个变量来控制每一层递归的区间集合(开头), 我们一般用 startindex
⇒ 所以我们的递归函数应该如下:
vector<int> path;
vector<vector<int>> result;
void backtracking(int n, int k, int startindex )
递归结束的条件
path是用来记录单层结果的, 根据题目要求,
递归结束的条件是: path的大小是2
那么我们就把path收入result里面, 并不继续向下递归
if(path.size()) == k){result.push_back(path);return;}
单层逻辑
单层逻辑肯定是一个for循环
for循环的起始点是 startindex, 终止点是 n
for(int i = startindex; i <= n; i++ ){}
我们先把沿途的数值收入path
for(int i = startindex; i <= n; i++ ){path.push_back(i);}
继续向下递归, 此时的起始点就变成 i + 1
for(int i = startindex; i <= n; i++ ){path.push_back(i);backtracking(n, k, i + 1);}
回溯, 让一棵树的情况更加完整
for(int i = startindex; i <= n; i++ ) // 控制横向遍历{path.push_back(i); // 处理节点backtracking(n, k, i + 1); // 纵向递归path.pop_back(); // 回溯, 撤销处理的节点}```## 代码```cpp
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startindex){// 终止条件if(path.size() == k){result.push_back(path);return ;}// 单层逻辑for(int i = startindex; i <= n; i++){path.push_back(i);backtracking(n, k, i + 1);path.pop_back(); // 回溯}}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

组合总和 III
力扣链接
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
- 提示:
2 <= k <= 9
1 <= n <= 60
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startindex, int sum){if(path.size() == k && sum == n){result.push_back(path);return ;}for(int i = startindex; i <= 9; i++){path.push_back(i);sum += i;backtracking(n, k, i + 1, sum);sum -= i;path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(n, k, 1, 0);return result;}
};

相关文章:
C国演义 [第三章]
第三章 组合分析步骤递归函数的返回值和参数递归结束的条件单层逻辑 组合总和 III 组合 力扣链接 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出࿱…...
数字化时代,企业的数据指标体系
在社会节奏越来越快,处理的信息量越来越大的今天,传统的经营管理模式已经适应不了当下的环境。而由经验、情感组成的业务调整以及决策能力不再能正确指导企业走在正确的方向上,所以数据就成为了企业新的业务优化调整和支撑企业高层管理进行决…...
三分钟了解 RocketMQ消息队列
文章目录 基本概念详细介绍主题(Topic)消息类型(MessageType)消息队列(MessageQueue)消息(Message)消息视图(MessageView)消息标签(MessageTag&am…...
golang redis第三方库github.com/go-redis/redis/v8实践
Redis基本数据类型代码示例# 这里示例使用 go-redis v8 ,不过 go-redis latest 是 v9 安装v8:go get github.com/go-redis/redis/v8 Redis 5 种基本数据类型: string 字符串类型;list列表类型;hash哈希表类型&#…...
校园网WiFi IPv6免流上网
ipv6的介绍 IPv6是国际协议的最新版本,用它来取代IPv4主要是为了解决IPv4网络地址枯竭的问题,也在其他很多方面对IPv4有所改进,比如网络的速度和安全性。 IPv4是一个32位的地址,随着用户的增加在2011年国家报道说IPv4的网络地址即…...
java 阿里云直播配置及推拉流地址获取
一、开通阿里云直播 首先进入阿里云直播产品主页:https://www.aliyun.com/product/live 。 点击下方的“立即开通”。 如果是还未注册的用户请按照页面提示进行完成注册并实名认证。 2、首次进入会提示开通服务,点击“开通服务”,然后选择计…...
PostgreSql 限制
参考:https://www.postgresql.org/docs/current/limits.html 项目上限说明单个数据库尺寸无限制null单个实例中数据库数量4,294,950,911null单个数据库中关系数量1,431,650,303null单个关系尺寸32 TB数据块为8k时单个表行数受4,294,967,295页的元组数量限制null单个…...
2023年java还是golang还是c#?
前言 我们可以先来看一下这三门语言各自的优劣 学习曲线:如果你是初学者或对编程相对陌生,Java可能是一个较好的选择。它有广泛的学习资源和社区支持,易于上手。Go也有简单易学的特点,但由于相对较年轻,相关的学习资…...
微服务、SpringBoot、SpringCloud 三者的区别
🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…...
2023-07-10 cmake管理的项目中使用vcpkg管理第三方库
一、安装 从Github上克隆Vcpkg仓库然后执行安装命令即可: git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat 安装自己需要的第三方库 .\vcpkg\vcpkg install [packages to install] 更多教学可参考: https://learn.microsoft…...
【剑指offer】学习计划day3
目录 一. 前言 二.替换空格 a.题目 b.题解分析 c.AC代码 三. 左旋转字符串 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接: 剑指offer-学习计划https://leetcode.cn/stud…...
QT DAY1
做一个窗口界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);//设置窗口标题、图标this->setWindowTitle("Fly_Chat")…...
Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影
前言 在mybatis_plus的封装中的Wrapper<T>接口参数就是用于封装查询条件 在测试类中启动如上一个简单的查询,然后控制台运行会输出一大堆无关日志,这里先把这些日志关闭 去除无关日志文件 先新建一个XML配置文件 然后变成如下,这里…...
网络安全(黑客)自学
建议一:黑客七个等级 黑客,对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域,越深入越敬畏,知识如海洋,黑客也存在一些等级,参考知道创宇 CEO ic(世界顶级黑客团队 0x557 成员…...
通过一个实际例子说明Django中的数据库操作方法OneToOneField()的用法【数据表“一对一”关系】
当我们在Django中定义一个模型时,可以使用OneToOneField来建立一个一对一的关系。这种关系表示两个模型之间的一种特殊关联,其中一个模型的实例只能与另一个模型的实例关联。 让我们以一个简单的示例来说明OneToOneField的用法。假设我们正在构建一个简…...
HarmonyOS学习路之开发篇—数据管理(对象关系映射数据库)
HarmonyOS对象关系映射(Object Relational Mapping,ORM)数据库是一款基于SQLite的数据库框架,屏蔽了底层SQLite数据库的SQL操作,针对实体和关系提供了增删改查等一系列的面向对象接口。应用开发者不必再去编写复杂的SQ…...
实验:验证TCP套接字传输的数据不存在数据边界
来源:《TCP/IP网络编程》 学习ing 自己动手,把坑踩一遍,也可以学习到很多。 Linux环境下: 客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <…...
【网络】协议的定制与Json序列化和反序列化
文章目录 应用层初识TCP协议通讯流程定制协议再谈协议网络版本计算器Protocal.hppCalServerCalClient Json的安装 应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 初识TCP协议通讯流程 建立链接和断开链接 基于TCP协议,…...
浙大数据结构第一周最大子列和问题
题目详情: 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 }ÿ…...
Selenium基础 — Selenium自动化测试框架介绍
1、什么是selenium Selenium是一个用于Web应用程序测试的工具。只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。Selenium测试套件直接运行在浏览器中,就像真正的用户在操作浏览器一样。Selenium也是…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
