回溯算法练习day.2

216.组合总和III

链接:. - 力扣(LeetCode)

题目描述:

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

思路:

因为是求组合问题,所以使用回溯算法来实现,当出现符合我们要求的结果时,则进行收集,不断进行向下递归

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
//存储单个满足条件的结果
int *path;
int pathtop;
//存储所有的结果
int **result;
int resulttop;

void backtracking(int target, int k , int sum, int startindex)
{
    if(pathtop == k)
    {
        if(sum == target)
        {
            int *temp = (int *)malloc(sizeof(int) * k);
            for(int i = 0 ; i < k ; i++)
                temp[i] = path[i];
            result[resulttop++] = temp;
        }
        return;
    }

    for(int i = startindex; i <= 9; i++)
    {
        sum += i;
        path[pathtop++] = i;
        backtracking(target,k,sum,i+1);
        sum -= i;
        pathtop--;
    }
}

int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes) {
    path = (int *)malloc(sizeof(int) * k);
    result = (int **)malloc(sizeof(int *) * 1000);
    pathtop = resulttop = 0;

    backtracking(n, k, 0, 1);
    *returnSize = resulttop;

    *returnColumnSizes = (int *)malloc(sizeof(int) * resulttop);
    for(int i = 0; i < resulttop ; i++)
        (*returnColumnSizes)[i] = k;
    
    return result;
}

剪枝操作:

当我们遍历到的值已经大于我们的目标值时,我们可以直接进行回溯,而不需要再进行遍历

只需要的判断if(pathtop == k)之前进行剪枝,即加上下面的代码

if(sum > target)
        return ;

如果当前的元素总和已经超出我们需要的返回,直接就可以进行回溯

 

17.电话号码的字母组合

链接:. - 力扣(LeetCode)

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

 

思路:

因为是求组合问题,因此可以使用回溯算法解决,我们以题目的示例1为例,将其抽象为一颗树形的结构,即如下所示

我们可以根据抽象的树形结构可知,符合要求的组合的长度与题目传入的字符串的长度一致,并且我们可以将题目给出的数字映射到一个数组中,数组的下标就是对应的数字,存储的值就是数字对应的字符串,for循环就是横向遍历,而递归是纵向遍历

代码实现:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

//将字符进行映射
char map[10][5] = {"\0","\0","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//存放单个组合
char *path;
int pathtop;
//存放所有的组合
char **result;
int resulttop;

//传入的参数为题目提供的字符串,遍历到字符串的位置
void backtracking(char *digits, int index)
{
    //如果字符串已经遍历完成
    if(index == strlen(digits))
    {
        //开辟数组,用来复制path的值,数组的大小应该为digits的长度+1
        //digits数组的长度就是每个子集中元素的个数,+1是存放'\0'
        char *temp = (char *)malloc(sizeof(char) * strlen(digits) + 1);
        //复制path数组
        for(int i = 0; i < strlen(digits); i++)
            temp[i] = path[i];
        //末尾位置加上'\0'
        temp[strlen(digits)] = '\0';
        //将符合条件的组合存入结果集中
        result[resulttop++] = temp;

        return ;  
    }
    //找出digits数组中当前遍历位置对应的字符并转化为数字
    int digit = digits[index] - '0';
    //通过数字找到映射数组中存储的字符串
    char *p = map[digit];
    //字符串不空
    for(int i = 0; i < strlen(p) ;i++)
    {
        //取出元素存放到组合中
        path[pathtop++] = p[i];
        //向下遍历,遍历的是下一个数字在map数组中对应的字符串
        backtracking(digits,index+1);
        //回溯
        pathtop--;
    }
}

char** letterCombinations(char* digits, int* returnSize) {
    path = malloc(sizeof(char) * strlen(digits) + 1);
    result = (char **)malloc(sizeof(char *) * 300);

    *returnSize = 0;
    if(strlen(digits) == 0)
        return result;
    
    pathtop = resulttop = 0;
    backtracking(digits,0);
    *returnSize = resulttop;

    return result;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的RFID智能门锁系统

本文针对RFID技术&#xff0c;着重研究了基于单片机的智能门锁系统设计。首先&#xff0c;通过链接4*4按键模块与主控STM32&#xff0c;实现了多种模式&#xff0c;包括刷卡开锁、卡号权限管理、密码开锁、修改密码、显示实时时间等功能。其次&#xff0c;采用RC522模块与主控S…

【C语言基础】:预处理详解(二)

文章目录 一、宏和函数的对比二、#和##运算符2.1 #运算符2.2 ##运算符 三、#undef四、命令行定义五、条件编译六、头文件的包含1. 头文件包含的方式2. 嵌套文件包含 上期回顾&#xff1a; 【C语言基础】&#xff1a;预处理详解(一) 一、宏和函数的对比 宏通常被应有于执行简单…

Vue3---基础10(路由)

写一个最基本的路由导航 下载、创建、使用路由 下载路由 npm i vue-router 创建路由 先在 src 内去创建一个 router 文件夹 在文件夹内创建一个 index 文件 index.ts 内代码 // 创建一个路由器&#xff0c;并暴露出去 // 引入createRouter import { createRouter, createWeb…

CSS使用自己的字体

在项目的根目录下的static文件夹中放置字体文件。在项目中使用这个字体&#xff0c;需要2个步骤。 一. 你需要在全局样式文件中引入它。 假设你的全局样式文件是App.vue或者App.vue中引入的App.scss文件&#xff0c;你可以像这样引入字体文件&#xff1a; font-face {font-fa…

深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

1. 卷积神经网络 卷积神经网络&#xff08;CNN&#xff09;是一种特别适用于处理具有网格结构的数据&#xff0c;如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统&#xff0c;这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…

MySQL中的存储过程详解(上篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…

C#基础|数据类型、变量

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 数据类型 数据类型是为了方便存储数据的&#xff0c;为了将数据按照不同的分类存储&#xff0c;所以引入数据类型。这个在PLC中已经很熟悉了。 数据类型的作用&#xff1a;就是为了更好地管理内存&#xff0c;为…

顺序表 (头删 尾删 清空)

//头删 | 1 #include "head.h" | 1 #ifndef ww87 void head_del(p lp) | 2 int main(int argc, const char *argv[]) …

[C++][算法基础]求最小生成树(Kruskal)

给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff0c;E 表示图…

民航电子数据库:[E14024]事务内变更操作次数超过最大许可值10000,可通过系统参数max_trans_modify适当调整限制

目录 一、场景二、异常情况三、原因四、排查五、解决 一、场景 1、对接民航电子数据 2、执行delete语句时报错 二、异常情况 三、原因 通过报错信息就可以看出&#xff0c;是系统参数max_trans_modify配置导致 当删除的数据量 > max_trans_modify时&#xff0c;删除就会…

Visual studio项目默认“Header Files”、“Source Files”等过滤器消失后展开的方法。

使用Visual Studio进行项目开发创建默认工程的解决方案资源管理器里查看项目文件&#xff0c;所有的文件是按照其所属的类型自动归类&#xff0c;例如&#xff1a;.h头文件自动划归到Header Files文件夹&#xff0c;.cpp文件自动划归到Source Files文件夹下&#xff0c;如下图所…

关于AG32 MCU的一些奇思妙想

1、AG32VF103的网口是100M还是10M&#xff1f; RE: 都是100M的。 2、用FPGA能不能再仿出一个网口&#xff1f;有些产品用到两个网口。 理论上可以&#xff0c;但是要考虑&#xff0c;一个是cpld实现难度&#xff0c;一个是需要的逻辑单元。因为mac逻辑多&#xff0c;内置的2KL…

Python Flask Web 框架-API接口开发_4

一、1、安装 Falsk 当前用户安装 pip3 install --user Flask 确认安装成功&#xff1a; 进入python交互模式看下Flask的介绍和版本&#xff1a; $ python3>>> import flask >>> print(flask.__doc__)flask~~~~~A microframework based on Werkzeug. Its …

快速掌握Spring监控(Spring Boot admin)

监控 监控可视化监控平台Admin底层逻辑info 自定义端点 监控 监控的作用&#xff1a; 监控服务状态是否宕机监控服务运行指标&#xff08;内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等&#xff09;监控日志管理服务&#xff08;服务下线&#xff09; 监控的实…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址&#xff0c;我下载的下图这个&#xff0c;下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字&#xff08;C98&#xff09; 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰&#xff08;name Ma…

IntelliJ IDEA 2023中文--让编程更高效、更智能

IntelliJ IDEA 2023是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发者打造。它以其智能、高效和人性化的特点&#xff0c;帮助开发者更快、更好地编写代码。IntelliJ IDEA 2023支持多种语言和框架&#xff0c;包括Java、Kotlin、Spring等&am…