代码随想录算法训练营第二十五天| 回溯算法理论基础、LeetCode77.组合

一、216.组合总和III

题目链接/文章讲解/视频讲解: https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
状态:已解决

1.思路 

        做过77题(上篇博客)后,这道题也就不难了,无非是多加了一个条件:组合之和等于n,只需要将这个加到终止条件那里即可。但这道题也有简化的地方,就是明确了每个样例的整个集合已经是固定的[1,...,9]。做过77就明白此题的做题套路了。

        直接套模板:

(1)返回值为空,参数需要有:每层递归for循环的开始值m(组合无序,若每层递归for循环都是1~9,那么会出现{1,3}和{3,1}这种相同的组合方式)、前面递归所选值的累加和sum、n、k。

void backtracking(int m,int k,int n,int sum)

(2)终止条件:vec.size() == k(vec是存放一条路径的变量),sum==n。

if(vec.size() == k){if(sum==n)result.push_back(vec);return ;//一定要return
}

(3)单层递归逻辑:for循环m~9,i的值放入vec中,sum加上i,开始子递归,然后再将i弹出。

for(int i=m;i<=9;i++){vec.push_back(i);backtracking(i+1,k,n,sum+i);vec.pop_back();
}

2.完整代码

class Solution {
public:vector<int> vec;vector<vector<int>> result;void backtracking(int m,int k,int n,int sum){if(vec.size() == k){if(sum==n)result.push_back(vec);return ;}for(int i=m;i<=9;i++){vec.push_back(i);backtracking(i+1,k,n,sum+i);vec.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {vec.clear();result.clear();backtracking(1,k,n,0);return result;}
};

另外,还可以减枝:当sum>n时,也终止。(for循环终止条件也可以为 i<9-(k-vec.size())+1 ,跟vec.size()==k终止差不多,故未添加。)

class Solution {
public:vector<int> vec;vector<vector<int>> result;void backtracking(int m,int k,int n,int sum){if(sum > n) return;if(vec.size() == k){if(sum==n)result.push_back(vec);return ;}for(int i=m;i<=9;i++){vec.push_back(i);backtracking(i+1,k,n,sum+i);vec.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {vec.clear();result.clear();backtracking(1,k,n,0);return result;}
};

二、LeetCode77.组合

题目链接/文章讲解/视频讲解: 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
状态:已解决

1.思路

        首先,这里有一段对应关系,每个数字对应几个字符。因此,我们第一步需要先存一个对应的字典。(这里可以用字符串数组存,也可以用vector<string>存,当然也可以用map做映射)

map<string,string> dic;
Solution() {dic["2"] = "abc";dic["3"] = "def";dic["4"] = "ghi";dic["5"] = "jkl";dic["6"] = "mno";dic["7"] = "pqrs";dic["8"] = "tuv";dic["9"] = "wxyz";
}

         做完这步后面回溯三部曲就跟前面的差不多了。

 (1)返回值为空,参数需要有:目前遍历到digits的位置k、目前选择路径path、digits。

void backtracking(string digits, int k, string path)

(2)终止条件digits.size() == k,sum==n。

if(digits.size() == k){result.push_back(path);return ;
}

(3)单层递归逻辑:根据k得出当前位置的数字,根据字典得到该数字对应的字符串,然后用for循环选择的字符加入现有路径中。

string s = dic[digits.substr(k, 1)];
for(int i=0; i<s.size(); i++){backtracking(digits, k+1, path + s[i]);
}

2.完整代码

class Solution {
public:map<string,string> dic;vector<string> result;Solution() {dic["2"] = "abc";dic["3"] = "def";dic["4"] = "ghi";dic["5"] = "jkl";dic["6"] = "mno";dic["7"] = "pqrs";dic["8"] = "tuv";dic["9"] = "wxyz";}void backtracking(string digits, int k, string path){if(digits.size() == k){result.push_back(path);return ;}string s = dic[digits.substr(k, 1)];for(int i=0; i<s.size(); i++){backtracking(digits, k+1, path + s[i]);}}vector<string> letterCombinations(string digits) {result.clear();if(digits.size() == 0) {return result;}backtracking(digits, 0, "");return result;}
};

 

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

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

相关文章

python--sys模块,time模块

1&#xff1a;sys模块 time.struct_time 实现时间转换 >>> import sys >>> dir(sys) getallocatedblocks, getdefaultencoding, getfilesystemencodeerrors, getfilesystemencoding, getprofile, getrecursionlimit, getrefcount, getsize…

软件之禅(十一) 消息

黄国强 2024/03/30 图灵机三个部分&#xff1a;纸带&#xff0c;读写头&#xff0c;控制器之间是通过消息来交互的。消息有多种形式&#xff0c;举一个最常见的一个例子&#xff0c;我们调用一个函数或过程&#xff0c;这可以认为是向这个函数或过程发了一个消息。 从耦…

python中pow()函数的使用

在Python中&#xff0c;pow() 函数用于计算指定数字的幂。它的语法如下&#xff1a; pow(x, y) 这个函数返回 x 的 y 次方。相当于 x**y。 pow() 函数也可以接受一个可选的第三个参数&#xff0c;用于指定一个取模值&#xff0c;即计算结果与该模值的余数。其语法如下&#…

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…

Docker Swarm安装部署应用

一、Docker Swarm核心概念 1、什么是Docker Swarm GitHub地址 Docker Swarm 是 Docker 官方推出的容器集群管理工具&#xff0c;基于 Go 语言实现。使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Docker Swarm 是生产…

Android Fence机制

Android Fence机制 Android中的GraphicBuffer同步机制-Fence &#xff08;最全最详细&#xff0c;推荐&#xff09; AndroidQ 图形系统&#xff08;5&#xff09;Fence机制简介 Android P 图形显示系统&#xff08;十一&#xff09; BufferQueue&#xff08;二&#xff09;

智算AI平台介绍:Volcano的Queue

上一篇提到&#xff0c;Volcano涉及了三个重要的功能--Queue&#xff0c;Podgroup, VCjob; 今天主要介绍的的Queue&#xff01; Queue属于资源级别的对象&#xff0c;可声明资源配额&#xff0c;多个namespace共享。一般一个算法部门对应一个volcano queue Queue是容纳一组p…

C# winform校验文件版本差异及版本号

界面 代码 using System.Diagnostics;namespace VersionTool {public partial class Form1 : Form{List<string> fileNmaes new List<string>() { "PhotoMes.Base.dll", "PhotoMes.App.exe", "PhotoMes.Cameras.dll" };public F…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 一.快速排序&#xff08;升序为例&#xff09; 思想&#xff1a;确定分界点x&#xff0c;将小于分界点的值放在分界点的左边&#xff0c;将大于分界定的值放在分界点的右边&#xff0c;再递归处理两边的左右区间。 步骤&am…

如何注册Claude3?解决Claude3无海外手机号接收验证码的问题以及如何订阅Claude Pro

原文链接&#xff1a;如何注册 Claude3&#xff1f;解决 Claude3 无海外手机号接收验证码的问题以及如何订阅 Claude Pro 前言 Claude3已经出来有一段时间了&#xff0c;大家有没有体验过呢&#xff1f;不过从目前来看&#xff0c;Anthropic公司总共推出了3个模型&#xff1…

web渗透测试漏洞复现:nacos未授权访问漏洞复现并getshell

web渗透测试漏洞复现 1. Hadoop 未授权访问漏洞复现 1. Hadoop 未授权访问漏洞复现 nacos未授权访问

使用 golang 以及 Gin 框架,将上传的图片在不保存至本地的情况下添加水印,并上传至阿里云 OSS

正如标题所述&#xff0c;使用golang对上传图片添加水印&#xff0c;以及将图片上传到阿里云OSS&#xff0c;网上一搜索&#xff0c;便有你想要的结果了&#xff0c;可是&#xff0c;他们却先将上传图片添加水印后保存在本地&#xff0c;而后再将添加了水印的图片上传到阿里云O…

当iPhone中的Wi-Fi变灰时别担心,可以尝试这些解决办法

这篇文章解释了当iPhone上的Wi-Fi变灰时,你应该检查并修复的所有事情。 确保飞行模式关闭 这听起来可能很傻,但在执行任何其他操作之前,请确保未打开飞机模式。此功能禁用Wi-Fi(和蜂窝网络),因为它旨在允许你在通常不允许传出无线通信的飞机上使用手机。 查看飞行模式…

MySQL8存储过程整合springboot

注意&#xff1a;调用使用mybatis-plus3形式调用&#xff0c;可能会有些区别 1. 创建存储过程 -- -- 生成员工工号的存储过程 DELIMITER $$ CREATE PROCEDURE generate_employee_number(OUT employeeNumber VARCHAR(20)) -- 解释 out 一个返回值 BEGINDECLARE prefix VARCHAR…

Linux 动静态库的制作,使用和加载

Linux 动静态库的制作,使用和加载 一.前置说明1.mylib.h2.mylib.c3.mymath.h mymath.c4.如何制作库 二.动静态库的制作1.静态库的制作1.制作2.使用一下静态库,验证是否成功打包 2.动态库的制作1.编译.c源文件文件生成.o目标文件2.打包生成动态库3.编写makefile文件,自动化制作动…

从0开始打架基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(@vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本初始化项目 创建一个git项目(可以去gitee/github上创建),注意创建一个空项目创建项目vue create mvp-admin-vue-ui删除自己创建的gi…

前后缀分离,LeetCode 2908. 元素和最小的山形三元组 I

目录 一、题目 1、题目描述 2、接口描述 ​cpp python3 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 ​cpp python3 一、题目 1、题目描述 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为…

OpenHarmony实战:烧录Hi3516DV300开发板

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 Hi3516DV300 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。 这块开发…

C++ :STL中deque的原理

deque的结构类似于哈希表&#xff0c;使用一个指针数组存储固定大小的数组首地址&#xff0c;当数据分布不均匀时将指针数组内的数据进行偏移&#xff0c;桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来&#xff0c;从原理可以看出deque的性能是非常高的…

LTE信令和协议

****部分笔记***** 控制面连接&#xff08;Control Plane Connection&#xff09;是在LTE和5G网络中的一个重要概念&#xff0c;它用于在设备和网络之间传输控制信息。控制面连接主要用于以下几种情况&#xff1a; 设备接入和鉴权&#xff1a;当设备需要接入网络时&#xff0c…