代码随想录算法训练营第二十五天| 回溯算法理论基础、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…

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 是生产…

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…

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

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

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

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

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…

OpenHarmony实战:烧录Hi3516DV300开发板

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

C++ :STL中deque的原理

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

ISP-VPN实验

文章目录 ISP-VPN实验一&#xff0c;实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…

环境影响与碳排放生命周期评估应用及案例分析

生命周期分析 (Life Cycle Analysis, LCA) 是评价一个产品系统生命周期整个阶段——从原材料的提取和加工&#xff0c;到产品生产、包装、市场营销、使用、再使用和产品维护&#xff0c;直至再循环和最终废物处置——的环境影响的工具。这种方法被认为是一种“从摇篮到坟墓”的…

用JSch实现远程传输文件并打包成jar

本文将简单介绍一下 JSch 这个Java的第三方库的一个简单用法&#xff0c;并以此为实例&#xff0c;讲解 IntelliJ 中打包成 jar 包的2种方式。 实现目标 我们的目标是&#xff0c;做出一个jar包&#xff0c;它能够实现类似于 scp 命令的远程传输文件的功能。用法如下&#xf…

应急响应靶机训练-Linux2题解

前言 接上文&#xff0c;应急响应靶机训练Linux2 靶机地址&#xff1a;应急响应靶机-Linux(2) 题解 登录虚拟机&#xff1a; 修改面板密码 提交攻击者IP 答案&#xff1a;192.168.20.1 查看宝塔日志即可 用的net直接是网关 提交攻击者修改的管理员密码(明文) 答案&…

LeetCode---390周赛

题目列表 3090. 每个字符最多出现两次的最长子字符串 3091. 执行操作使数据元素之和大于等于 K 3092. 最高频率的 ID 3093. 最长公共后缀查询 一、每个字符最多出现两次的最长子字符串 非常经典的滑动窗口问题&#xff0c;即动态维护一段区间&#xff0c;使得这段区间满足…

JUC:park/unpark的用法与原理

park / unpark 用法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象)**先说结论&#xff1a;**无论unpark在park前还是后&#xff0c;都可以解除暂停状态。 先park在unpark可以成功运行&#xff1a; Thread t1 new Thread((…

全局UI方法-弹窗二-列表选择弹窗(ActionSheet)

1、描述 定义列表弹窗 2、接口 ActionSheet.show(value:{ title: string | Resource, message: string | Resource, autoCancel?: boolean, confrim?: {value: string | Resource, action: () > void }, cancel?: () > void, alignment?: DialogAlignment, …