代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合 [回溯篇]

代码随想录算法训练营第二十五天

  • LeetCode 216.组合总和III
    • 题目描述
    • 思路
    • 参考代码
    • 总结
  • LeetCode 17.电话号码的字母组合
    • 题目描述
    • 思路
    • 参考代码


LeetCode 216.组合总和III

题目链接:216.组合总和III
文章讲解:代码随想录#216.组合总和III
视频讲解:回溯算法如何剪枝?| LeetCode:216.组合总和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
没有其他符合的组合了。

提示

  • 2 <= k <= 9
  • 1 <= n <= 60

思路

在数字1到9之间找到k个数,其和为n,并且保证每个数字只能使用一次。
如果使用k个for循环遍历数字,明显不太合适,所以此题应使用回溯法来求解。

k表示递归的次数,也就是树的深度。
数字1到9表示每次遍历树的宽度,题中要求每个数字只使用一次,所以每次递归时需要考虑遍历1到9的索引。
回溯的终止条条件为数的和为n。

在遍历的过种中也可以考虑如下的剪枝操作:
①当数和已经大于n了,退出当前循环。
②当剩余的数字少于还需要的数字个数时,for循环结束。

参考代码

int sum, cnt;
int** res;
typedef struct {int index;int nums[10];
} Data;Data data = {0};void backtracking(int k, int n, int idx) {if (data.index == k) {if (sum == n) { // 符合条件,记录数据res[cnt] = malloc(k * sizeof(int));for (int i = 0; i < k; i++)res[cnt][i] = data.nums[i];cnt++;}return;}// 剪枝二:保证剩余数字个数大于等于还需要的数字个数for (int i = idx; i <= 9 - (k - data.index) + 1; i++) {if (sum + i > n)break; // 剪枝一:如果sum+i大于n,直接跳出for循环sum += i;data.nums[data.index++] = i;backtracking(k, n, i + 1);sum -= i; // 回溯data.index--;data.nums[data.index] = 0;}
}int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes) {res = (int**)malloc(100 * sizeof(int*));sum = 0;cnt = 0;backtracking(k, n, 1);*returnSize = cnt;*returnColumnSizes =(int*)malloc(sizeof(int) * cnt); // 需要给returnColumnSizes分配内存for (int i = 0; i < cnt; i++) {(*returnColumnSizes)[i] = k;}return res;
}

总结

  1. 这道题相对 LeetCode 77.组合 多了一个条件,需要找出和为n的k个数的组合,整个集合是固定的,相对来说也比较简单。

LeetCode 17.电话号码的字母组合

题目链接:17.电话号码的字母组合
文章讲解:代码随想录#17.电话号码的字母组合
视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例1

输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例2

输入:digits = “”
输出:[]

示例3

输入:digits = “2”
输出:[“a”,“b”,“c”]

提示

  • 0 <= digits.length <= 4
  • digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

思路

这道题关键是需要构建一个数字与字母转换的表,如:
[2] = [“abc”]
[3] = [“def”]

对于示例1来说,输入了两个数字2和3,树的深度为2。
首先遍历数字2,从转换表中取出字符串"abc",
然后先遍历a,将a存起来,(第一层)
调用递归函数,在递归函数中,遍历数字3…(第二层)
退出递归函数后,进行回溯操作,
接着再遍历b,将b存起来,

直到遍历完c后(遍历树的宽度)。

可以构建一个递归函数,返回值为void,参数有两个人,一个是输入的字符串,一个是当前遍历层级。
递归函数的终止条件是digits取完所有的数字(代表递归的次数,也是树的深度)。

参考代码

char **res;
int cnt;
typedef struct {int index;char str[5];
}Data;
Data data = {0};char *convert[] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9
};void backtracking(char *src, int level)
{if (strlen(src) == level) {res[cnt] = (char*)malloc(sizeof(char) * (data.index + 1));        strcpy(res[cnt++], data.str);return; }char *s = convert[src[level] - '0'];int len = strlen(s);for (int i = 0; i < len; i++) {data.str[data.index++] = s[i];backtracking(src, level + 1);data.index--; // 回溯data.str[data.index] = '\0';}
}char** letterCombinations(char* digits, int* returnSize) {if (strlen(digits) == 0) {*returnSize = 0;return NULL;}res = (char**)malloc(1000 * sizeof(char*));cnt = 0;    backtracking(digits, 0);*returnSize = cnt;return res;
}

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

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

相关文章

Java零基础 - 字符串连接运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

linux ubuntu 开发环境搭建 opencv fftw openvino

OpenCV 下载 opencv 源码&#xff1a;Releases - OpenCV 官方安装文档&#xff1a;https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html 详细的安装过程可以参考文章&#xff1a; 在 Linux 系统中编译安装 OpenCV - 知乎 安装依赖项&#xff1a; sudo apt-get …

ubuntu 22 安装 python3.11.7

ubuntu升级python到python3.11&#xff08;可能是全网最靠谱的方法&#xff0c;亲测有效&#xff09;_ubuntu python3.11-CSDN博客 在 Ubuntu 中升级 Python 到 3.11 版本可以通过编译源代码或者使用第三方工具来完成。请注意&#xff0c;在升级 Python 之前&#xff0c;请确保…

采用遗传算法搜索MAC效率最高的矩阵乘规模

如何采用遗传算法搜索MAC效率最高的矩阵乘规模 具体实现MAC效率评估代码(eval.py)遗传算法实现 本文介绍了采用遗传算法搜索MAC效率最高的矩阵乘规模 需求背景: 一些AI加速卡在做矩阵乘时,因硬件或软件的约束,并不是规模越大MAC效率越高在测试AI加卡的实际算力时,采用MAC效率最…

vue 子组件获取父组件

父组件vue <template><el-carousel indicator-position"outside"><el-carousel-item ><child /></el-carousel-item><el-carousel-item ><h3>{{ 2 }}</h3></el-carousel-item></el-carousel> </tem…

acwing算法学习笔记 ------ 双链表

1、定义 这里可以做一个投机取巧&#xff0c;我们不再像单链表去用head去存头和尾&#xff0c;直接让r[0] 1,l[1] 0; idx 2.进行初始化&#xff0c; 解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标&#xff0c; r[N]:表示指向下一个节点的下标。大家不用担心i…

皓学IT:WEB03_MySQL

今日内容介绍 Mysql数据库 SQL语句 一、数据库 1.1. 数据库概述 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&#xff0c;删除及…

南京观海微电子---AXI总线技术简介——ZYNQ PS和PL的互联技术

1.AXI总线介绍 AXI全称Advanced Extensible Interface&#xff0c;是Xilinx从6系列的FPGA开始引入的一个接口协议&#xff0c;主要描述了主设备和从设备之间的数据传输方式。AXI协议在Xilinx的ZYNQ系列芯片中继续使用&#xff0c;协议版本是AXI4。 ZYNQ为Xilinx推出的首款将高…

解决vulhub漏洞环境下载慢卡死问题即解决docker-valhub漏洞环境下载慢的问题

解决vulhub环境下载慢/卡 当前环境为&#xff1a;ubuntu20 1.在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json编辑daemon.json文件 sudo vim daemon.json2.填写阿里云镜像地址&#xff1a; { "registry-mirrors":["https://6kx…

11-pytorch-使用自己的数据集测试

b站小土堆pytorch教程学习笔记 import torch import torchvision from PIL import Image from torch import nnimg_path ../imgs/dog.png imageImage.open(img_path) print(image) # imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.…

运维SRE-15 自动化批量管理-ansible1

## 1.什么是自动化批量管理重复性工作与内容: 思考如何自动化完成. 部署环境,批量查看信息,批量检查:自动化 一般步骤:1.如何手动实现2.如何自动化管理工具&#xff0c;批量实现3.注意事项&#xff1a;想要自动化一定要先标准化(所有环境&#xff0c;软件&#xff0c;目录一致)…

剑指offer面试题19 二叉树的镜像

考察点 树的遍历知识点 题目 分析 我们分析算法题目的思路基本上都是归纳法&#xff0c;即通过举一些普通的例子来推理出算法流程&#xff0c;而画图又是举例子的常用手段&#xff0c;比如针对树或者链表画画图&#xff0c;针对数字类的举一些数字的例子寻找规律&#xff0c…

《Docker极简教程》--Docker在生产环境的应用--Docker在生产环境的部署

一、准备工作 1.1 硬件和基础设施要求 硬件和基础设施要求是在部署 Docker 到生产环境之前需要认真考虑和准备的重要方面&#xff0c;以下是一般性的要求&#xff1a; 服务器硬件&#xff1a; CPU&#xff1a;建议使用多核处理器&#xff0c;以支持同时运行多个容器。内存&a…

复制策略深入探讨

在之前的博客中&#xff0c;我们讨论了复制最佳实践和不同类型的复制&#xff0c;例如批量、站点和存储桶。但是&#xff0c;随着所有这些不同类型的复制类型的出现&#xff0c;人们不得不想知道在哪里使用哪种复制策略&#xff1f;从现有 S3 兼容数据存储迁移数据时&#xff0…

在MFC对话框中嵌入web网页时事件失效问题

2010-04-20 日志 在MFC对话框中嵌入web网页时&#xff0c;网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…

C语言推荐书籍

本书详细讲解了C语言的基本概念和编程技巧。全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章&#xff5e;第15章详细讲解了C语言的相关知识&#xff0c;包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串…

自然语言处理Gensim入门:建模与模型保存

文章目录 自然语言处理Gensim入门&#xff1a;建模与模型保存关于gensim基础知识1. 模块导入2. 内部变量定义3. 主函数入口 (if __name__ __main__:)4. 加载语料库映射5. 加载和预处理语料库6. 根据方法参数选择模型训练方式7. 保存模型和变换后的语料8.代码 自然语言处理Gens…

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路2. 代码实现 题目链接&#xff1a;3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路 这道题倒是没啥特别的思路&#xff0c;直接暴力求解就是了&#xff0c;因此…

WPF 【十月的寒流】学习笔记(1):DataGrid过滤

文章目录 相关链接代码仓库前言环境DataGrid 数据筛选项目配置使用原理主要代码&#xff08;详细代码可以看我的GitHub仓库&#xff09;Models.PersonDataGirdViewDataGridViewModel 实现效果 总结 相关链接 十月的寒流 在 WPF 中制作 DataGrid 的数据筛选功能 WPF 中如何制作 …

Redis分布式锁正确使用

分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。 分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis非常适合作为分布式锁使用,并且在各个公司都大规模的使用。 本文将由浅入深的探究Redis分…