C国演义 [第三章]

news2025/1/12 8:43:07

第三章

  • 组合
    • 分析
    • 步骤
      • 递归函数的返回值和参数
      • 递归结束的条件
      • 单层逻辑
  • 组合总和 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;
        
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32训练—WiFi模块】第二篇、STM32驱动ESP8266WiFi模块获取天气

目录 第一部分、前言 1、获取心知天气API接口 2、硬件准备 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 2、具体步骤 第三部分、STM32驱动ESP8266模块获取天气数据 1、天气数据的解析 1.1、什么函数来解析天气数据&#xff1f; 2.1、解析后…

【MySQL数据库】MySQL索引

MySQL索引、事务与存储引擎 一、索引1.1索引的概念1.2索引的作用1.3索引的工作原理1.4索引的副作用1.5索引的应用场景 二、索引的创建与分类2.1普通索引&#xff0c;最基本的索引类型&#xff0c;没有唯一性之类的限制。2.2唯一索引2.3 主键索引2.4组合索引2.5全文索引 三、删除…

JMeter源码解析之结果收集器

目录 前言&#xff1a; 一、JMeter结果收集器概述 二、单机模式 三、分布式模式 四、总结 前言&#xff1a; JMeter是一款著名的开源性能测试工具&#xff0c;JMeter提供了多种结果收集器&#xff0c;以帮助用户对性能测试结果数据进行收集、整理和分析。 一、JMeter结果…

Mysql数据库初体验及管理

Mysql数据库初体验及管理 一、数据库相关概念1.数据库的组成2.数据库管理系统3.数据库系统 二、数据库的发展1.第一代数据库2.第二代数据库3.第三代数据库 三、主流的数据库介绍四、关系型数据库1、介绍2、实体3、关系4、属性非关系型数据库 五、Mysql数据库管理1、库和表2、常…

Excel 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建工作表 打开Excel 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;在弹出的菜单中选择“新建”选项&#xff0c;然后可以选择使用空白工作表或者…

工具-自动获取/校对XpathHelper/XpathHelperPlus/XPathHelperWizard插件轻松配置xpath规则

目录 一、xpath插件功能对比1.1、应用的范围1.2、不依赖插件&#xff0c;依赖谷歌开发者工具1.3、XpathHelper/XpathHelperPlus/XPathHelperWizard插件功能特点 二、安装XpathHelper插件以及用法2.1、安装XpathHelperPlus插件2.2、XpathHelperPlus插件使用方法 三、安装XPathHe…

自然语言处理: 第二章Word2Vec

一. 理论基础 维度很高(与语料库有关)&#xff0c;计算复杂稀疏性&#xff0c;浪费计算效率&#xff0c;只有一个元素是1 其他都是0缺乏语义信息&#xff0c;无法衡量语义相似度无法处理未知单词 而在One-Hot的基础上&#xff0c;Word2Vec 是一种分布式表达字/词的方式&#x…

Java|注解之定义注解

Java语言使用interface语法来定义注解&#xff08;Annotation&#xff09;&#xff0c;它的格式如下&#xff1a; public interface Report {int type() default 211;String level() default "211";String value() default "211"; } 注解的参数类似无参数…

华为OD机试真题 JavaScript 实现【比赛评分】【2023 B卷 100分】,附详细解题思路

一、题目描述 一个有N个选手参加比赛&#xff0c;选手编号为1~N&#xff08;3<N<100&#xff09;&#xff0c;有M&#xff08;3<M<10&#xff09;个评委对选手进行打分。打分规则为每个评委对选手打分&#xff0c;最高分10分&#xff0c;最低分1分。 请计算得分最…

Android 音视频开发核心知识点笔记整合

很多开发者都知道Android音视频开发这个概念&#xff0c;音视频开发不仅需要掌握图像、音频、视频的基础知识&#xff0c;并且还需要掌握如何对它们进行采集、渲染、处理、传输等一系列的开发和应用&#xff0c;因此&#xff0c;音视频开发是一门涉及到很多内容的领域。 随着5G…

开战在即!与全球伙伴一起打造你的数据应用,TiDB Future App Hackathon 2023 来啦!

2023 TiDB Future App Hackathon 来啦&#xff01;本届 Hackathon 的主题为&#xff1a;Code, Innovate & Build Amazing Data Applications —— 释放你的创造力、构建突破性的应用、在全球范围内寻找你的队友、体验最新最 in 的 Serverless 技术&#xff0c;更有 总计 $3…

马原第一章复习1.

一.物质的存在方式 《德法年鉴》 完成从唯物到唯心 从革命主义等到共产主义的过度 为创立马克思理论提供了根本前提《德意志形态》 首次阐述了历史唯物主义的基本观点《共产党宣言》标志着马克思主义的公开问世 也是第一个无产阶级政党的党纲《资本论》阐述剩余价值学说 解释生…

【推荐】Oracle Live SQL——在线 Oracle SQL 测试工具

最近回答了几个 CSDN “学习”功能里“问答”区的一些专业相关问题&#xff0c;回答过程中采用严谨的方式&#xff0c;在 Oracle Live SQL 上进行验证测试。这个很好用的 Oracle APEX 应用我使用好几年了&#xff0c;虽然近年来已转行 MySQL 和国产数据库领域&#xff0c;但仍然…

链表与顺序表的区别以及扩展计算机硬件的存储体系

好久没有更新文章了&#xff0c;在忙学校的事情时我还是比较怀念大家一直以来对我的关注和鼓励&#xff0c;接下来我会继续更新数据结构相关的文章&#xff0c;也请大家多多支持&#xff0c;十分感谢。正文来了&#xff1a; 首先说明一点&#xff0c;我在举例和比较时所使用的是…

【2023,学点儿新Java-02】计算机硬件与软件 | CPU、内存、硬盘概览 | 科学使用键盘——“指法” | 软件——计算机的灵魂 | 人机交互方式

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-01】从查看本机 jdk版本 开始 | Java基础全程脉络图、Java工程师全程技术路线、Java职业晋升路线图 我们见到的太阳 是八分钟前的太阳&#xff0c;见到的月亮 是一点三秒之前的月亮&#xff0c;见到一英里之外的建筑&…

【Docker 安装 Zipkin】—— 每天一点小知识

&#x1f4a7; D o c k e r 安装 Z i p k i n \color{#FF1493}{Docker 安装 Zipkin} Docker安装Zipkin&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》…

解决vue打包一次部署到不同的服务器的问题

1. 问题描述 在工作的时候&#xff0c;往往碰到同一套vue前端代码程序需要部署到很多的服务器上&#xff0c;每次更改完程序都需要打包部署到各个服务器上&#xff0c;因为每个服务器的访问地址和端口都不一样&#xff0c;如果用的若依自带的框架&#xff0c;需要每次都需要打…

Spring Security --- 自定义登录逻辑

目录 UserDetailsService详解 返回值 方法参数 异常 PasswordEncoder密码解析器详解 接口介绍 内置解析器介绍 BCryptPasswordEncoder简介 代码演示 自定义登录逻辑 编写配置类 自定义逻辑 UserDetailsService详解 当什么也没有配置的时候&#xff0c;账号和密码是…

Vue3:计算属性、监听器

computed 计算属性 计算属性是指 基于现有状态派生 (演变) 出新的状态&#xff0c;现有状态发生变化&#xff0c;派生状态重新计算。 computed 接收回调函数作为参数&#xff0c;基于回调函数中使用的响应式数据进行计算属性的创建&#xff0c;回调函数的返回值就是基于现有状态…

软件测试什么样的技术栈才能进入大厂

我们知道&#xff0c;能在一线大厂工作是大多数人的目标&#xff0c;不仅薪酬高&#xff0c;技能提升快&#xff0c;而且能得到公司影响力背书&#xff0c;将来就算跳槽也能带来光环加持。 最近疫情的影响&#xff0c;网上也爆出了一些裁员新闻&#xff0c;可以说这个疫情确实…