代码随想录算法训练营第24天(回溯2)| 216.组合总和III 17.电话号码的字母组合

回溯的总结:

树的深度(递归的层数)
树的深度就是要取的数据的个数,通过path的size判断是否收集到足够的数据
树的宽度(循环的范围)
输的宽度就是搜索的范围,就是for循环的循环范围,这个范围可以做剪枝操作
递归和回溯就是在这颗树上做搜索,深度优先

回溯的函数

退出条件:
收集到足够的数据,也就是到达了指定的深度
递归
每一个递归就是给一个范围获取一个数字,递归的获取数字,到了指定的数量(深度)结束递归
循环
进入下一个循环的时候需要回溯,将上一个递归获取的数据pop掉,用来接收下一个数据
剪枝
1 对循环的范围做剪枝
2 根据对数据的要求做做剪枝

216.组合总和III

leetcode题目链接
题目链接/文章讲解
视频讲解

//未剪枝代码
class Solution {
private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum:目标和,也就是题目中的n。// k:题目中要求k个数的集合。// sum:已经收集的元素的总和,也就是path里元素的总和。// startIndex:下一层for循环搜索的起始位置。void backtracking(int targetSum, int k, int sum, int startIndex) {if (path.size() == k) {if (sum == targetSum) result.push_back(path);return; // 如果path.size() == k 但sum != targetSum 直接返回}for (int i = startIndex; i <= 9; i++) {sum += i; // 处理path.push_back(i); // 处理backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯}}public:vector<vector<int>> combinationSum3(int k, int n) {result.clear(); // 可以不加path.clear();   // 可以不加backtracking(n, k, 0, 1);return result;}
};//剪枝操作后代码
class Solution {
private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果void backtracking(int targetSum, int k, int sum, int startIndex) {if (sum > targetSum) { // 剪枝操作return; }if (path.size() == k) {if (sum == targetSum) result.push_back(path);return; // 如果path.size() == k 但sum != targetSum 直接返回}for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝sum += i; // 处理path.push_back(i); // 处理backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯}}public:vector<vector<int>> combinationSum3(int k, int n) {result.clear(); // 可以不加path.clear();   // 可以不加backtracking(n, k, 0, 1);return result;}
};

17.电话号码的字母组合

leetcode题目链接

题目链接/文章讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html
视频讲解:https://www.bilibili.com/video/BV1yV4y1V7Ug
本题重点:

  1. 这里的digits的size就是搜索的深度
  2. index是digits的位置,index对应的字符串是循环的范围
//
class Solution {
private://映射表const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};
public:vector<string> result;string s;void backtracking(const string& digits, int index) {if (index == digits.size()) {result.push_back(s);return;}int digit = digits[index] - '0';        // 将index指向的数字转为intstring letters = letterMap[digit];      // 取数字对应的字符集for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            // 处理backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了s.pop_back();                       // 回溯}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if (digits.size() == 0) {return result;}backtracking(digits, 0);return result;}
};

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

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

相关文章

Java学习网络编程

Java学习网络编程 大纲 网络相关概念IP地址网络协议InetAdressSocket 具体案例 1. 网络相关概念 网络 网络通信 2. IP地址 域名 3.网络协议 4. InetAdress 获得本机的名字和IP public static void main(String[] args) throws UnknownHostException {InetAddress inetA…

SpringBoot中全局异常处理

一、全局异常处理 SpringBoot给我们提供了ControllerAdvice和 ExceptionHandler注解 注解的作用&#xff1a; ControllerAdvice用来开启全局的异常捕获&#xff0c; ExceptionHandler用来说明捕获哪些异常&#xff0c;并对这些捕获的异常进行处理。 二、具体代码样例 Res…

前端学习之路(6) npm详解

npm 是什么&#xff1f; npm&#xff08;node package manager&#xff09;&#xff1a;node.js 的包管理器&#xff0c;用于node插件管理&#xff08;包括安装、卸载、管理依赖等&#xff09; &#xff0c;npm 是随同 node.js 一起安装的包管理工具&#xff0c;能解决 node.j…

《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)

题目链接&#xff1a;LCR 036. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 后缀表达式是一种算术表达式&#xff0c;它的操作符在操作数的后面。输入一个用字符串数组表示的后缀表达式&#xff0c;请输出该后缀表达式的计算结果。假设输入的…

MySQL基础查询篇(7)-常用的字符串函数

MySQL数据库是目前广泛应用于各种系统中的一种关系型数据库管理系统。在MySQL中&#xff0c;有许多常见的字符串函数&#xff0c;可以对字符串进行各种处理和操作。本文将介绍MySQL数据库中常用的一些字符串函数&#xff0c;并提供详细示例。 CONCAT函数&#xff1a;用于将两个…

小项目:蓝牙模块点亮RGB三色灯

在之前的教程中&#xff0c;我们学习了蓝牙模块的原理&#xff0c;并动手写了驱动&#xff0c;实现了串口的接收和发送。本次我们就来教大家如何使用蓝牙串口控制灯。这是一个简单的示例&#xff0c;展示了如何将蓝牙通信与硬件控制相结合&#xff0c;实现远程控制的功能。你也…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息&#xff0c;统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

tsgctf-2021-lkgit-无锁竞争-userfaultfd

启动脚本 qemu-system-x86_64 \-kernel ./bzImage \-initrd ./rootfs.cpio \-nographic \-monitor /dev/null \-cpu kvm64,smep,smap \-append "consolettyS0 kaslr oopspanic panic1 quiet" \-no-reboot \-m 256M题目 lkgit_hash_object #define HASH_SIZE …

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念&#xff1a;程序的一个执行实…

QGIS介绍

一.基本概念 QGIS的官方网站为&#xff1a;https://www.qgis.org Github地址&#xff1a;https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2&#xff09;发布&#xff0c;主要采用C语言开发&#xff0c;用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML&#xff08;Unified Modeling Language&#xff09;是一种通用的建模语言&#xff0c;广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具&#xff0c;通过简单的文本描述&#xff0c;能够生成UML图&#xff0c;包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称&#xff0c;我们之前认识了进程的概念&#xff0c;现在我们来了解一下线程的概念 线程概念&#xff1a; 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定…

Linux命令-base64命令(编码/解码文件或标准输入输出)

说明 base64将 文件 或 标准输入 编码或解码为标准输出; 语法 base64 [OPTION]... [FILE]参数 -d, --decode # 解码 -i, --ignore-garbage # 解码时&#xff0c;忽略非字母字符 -w, --wrapCOLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行--help # 显示此帮助…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接&#xff1a; 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record&#xff0c;示例内容如下&#xff1a;。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

OpenAI使用的海量数据集介绍

1. OpenAI使用的数据 OpenAI为了训练其尖端的自然语言处理模型&#xff0c;如GPT-4&#xff0c;采用了极为庞大的数据集。虽然具体的细节可能不完全公开&#xff0c;但我们可以根据历史信息和公开报道推测&#xff0c;这些数据集通常包含&#xff1a; WebText&#xff1a;早期…

ComfyUI 学习笔记

目录 ComfyUI 入门教程 什么是ComfyUI&#xff1f; windows安装教程&#xff1a; 组件技巧学习 ComfyUI 入门教程 老V带你学comfyUI-基础入门 - 知乎 什么是ComfyUI&#xff1f; ComfyUI 是一个基于节点的 GUI&#xff0c;用于Stable Diffusion。你可以通过将不同的no…

conda创建环境,查看环境,激活环境,查看包,复制环境,删除环境,查看cuda版本,查看pytorch版本

创建环境 conda create --name [yourEnvname]查看环境 conda env list首次激活 conda 虚拟环境&#xff0c;使用source activate激活&#xff0c;以后可以使用 conda activate 激活虚拟环境 source activate [yourEnvname]激活环境 conda activate [yourEnvname]查看环境下…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆预约占座系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程&#xff0c; 面向过程就是一步一步去操作&#xff0c;你需要知道每一步的步骤。 面向对象的编程以对象为核心&#xff0c;通过定义类描述实体及其行为&#xff0c;并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…