代码随想录 | Day29 | 回溯算法:电话号码的字母组合组合总和

news2024/10/10 10:24:36

代码随想录 | Day29 | 回溯算法:电话号码的字母组合&&组合总和

关于这个章节,大家最好是对递归函数的理解要比较到位,听着b站视频课可能呢才舒服点,可以先去搜一搜关于递归函数的讲解,理解,再开始这个章节会比较好一些

我觉得回溯就是对传入递归函数的参数加加减减,加了的减掉,减了的加上

主要学习内容:

组合题目的模板

17.电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

解法思路:

这道题其实主要的难点是要搞清楚模板里面的for循环到底在干些什么事情

20201123200304469树的每个分支其实就是每一次for循环产生的,每一层递归函数的for循环可以整整产生一层节点,比如第一层递归函数的for产生的就是要分别取a,b,c,一共循环三次,取出来三个数,所以第一层有三个节点

第二层也是类似,分别选了def,才有了ad,ae,af三个结果,所以有3*3=9个结果

而第一层的abc是数字2的集合,第二层的def是数字3的集合,所以每一层递归函数都是在遍历一个不同的数的集合,我们要做的就是让递归函数知道他这一层要遍历哪个数字的集合

1.函数参数和返回值

vector<string> res;
vector<string> s{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//0,1没有,从2开始对应
void backtracking(string str,string digits,int index)

res存放结果集,s存放数字对应的字符串

传入的参数,str相当于path,收集我们已经知道的答案

digits是题目中给的字符串,index传递本层递归函数要遍历哪个集合

2.终止条件

一个数字只选一个字母,所以只要我们收集的和题目给的字符串一样大,就是答案了

if(str.size()==digits.size())
{
	res.push_back(str);
	return;
}

3.本层代码逻辑

t表示的是我们这层递归函数选的哪个数字,是由字符串里面的数字转换过来的

s[t]对应我们选的字符串(abc还是def)

遍历自然就遍历我们选的这个字符串,从0遍历到它结束,因为它的每一个字符我们都得选一遍的

s[t][i]就是对应每个字母,我们压入字符串(这里就是把23这个例子的a压入了),然后进入下一层递归去选下一个字母(去选def里面的字母去了就)

递归的index就直接+1即可,因为我们要选的就是下一个数字对应的集合

递归结束,把刚刚压入的字母弹出(把a弹出,等i等于1压入b)

int t=(int)(digits[index]-'0');
for(int i=0;i<s[t].size();i++)
{
	str.push_back(s[t][i]);
	backtracking(str,digits,index+1);
    //回溯
    str.pop_back();
}

完整代码:

class Solution {
public:
    vector<string> res;
    vector<string> s{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    void backtracking(string str,string digits,int index)
    {
        if(str.size()==digits.size())
        {
            res.push_back(str);
            return;
        }
        int t=(int)(digits[index]-'0');
        for(int i=0;i<s[t].size();i++)
        {
            str.push_back(s[t][i]);
            backtracking(str,digits,index+1);
            str.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
            return res;
        string str;
        backtracking(str,digits,0);
        return res;
    }
};

注:digits如果为空传个空就是。

39.组合总和

39. 组合总和 - 力扣(LeetCode)

思路:

和之前的思路差不多组合总和III,就是之前每层遍历是从i+1开始,是为了防止出现重复的数字,现在遍历从i开始,因为本身的数可以重复取

1.函数返回值和参数

vector<vector<int>> res;
void backtracking(vector<int> path,int sum,int index,vector<int> candidates,int target)

res记录结果

path收集当前组合

sum当前集合的总和

index从哪个数开始

candidates题目给的数组

target题目给的目标值

2.终止条件

当前总和已经大于target了,没必要再递归了

如果大小等于target,收集结果

if(sum>target)
	return;
if(sum==target)
{
	res.push_back(path);
	return;
}

3.本层逻辑

额就是可以重复取当前数字,所以下一层递归函数传参传i而不是i+1,i+1可以避免取重复的数字

不太好理解的话大家可以画个图模拟一下

for(int i=index;i<candidates.size();i++)
{
	path.push_back(candidates[i]);
	backtracking(path,sum+candidates[i],i,candidates,target);
	path.pop_back();
}

完整代码:

class Solution {
public:
    vector<vector<int>> res;
    void backtracking(vector<int> path,int sum,int index,vector<int> candidates,int target)
    {
        if(sum>target)
            return;
        if(sum==target)
        {
            res.push_back(path);
            return;
        }
        for(int i=index;i<candidates.size();i++)
        {
            path.push_back(candidates[i]);
            backtracking(path,sum+candidates[i],i,candidates,target);
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<int> path;
        backtracking(path,0,0,candidates,target);
        return res;
    }
};

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

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

相关文章

Linux -- 命令(一)

目录 知识点登入Xshellwhoamipwdlscdtouchstattreewhichll和ls和ls -lnanorm*关联符mancp 知识点 windows&#xff1a;\路径分隔符 Linux: /路径分割符目录 文件夹 如果建立一个空文件&#xff0c;修改文件也要占据磁盘空间文件 内容 属性 学习文件&#xff1a;要么对内容操…

宝塔面板专业版有什么区别?支持更多专业版插件

宝塔面板专业版和免费版有什么区别&#xff1f;宝塔面板专业版相比免费版支持更多专业版插件&#xff0c;包括&#xff1a;防火墙、网站监控、宝塔任务管理、对象存储、宝塔系统加固等专业版插件&#xff0c;详细参考 bt.cn/u/DjHjth 宝塔面板专业版和免费版区别 宝塔linux面板…

快速部署vue项目

简介 在现代前端开发中&#xff0c;工具的选择对于提高开发效率至关重要。Vite 是一个新型的前端构建工具&#xff0c;它利用了 ES 模块的特性来提供快速的开发体验。而 pnpm 则是一个高效的包管理器&#xff0c;能够极大地节省磁盘空间并加速依赖安装过程。本文将介绍如何使用…

Python | 由高程计算坡度和坡向

写在前面 之前参加一个比赛&#xff0c;提供了中国的高程数据&#xff0c;可以基于该数据进一步计算坡度和坡向进行相关分析。 对于坡度和坡向&#xff0c;这里分享一个找到的库&#xff0c;可以方便快捷的计算。这个库为&#xff1a;RichDEM&#xff0c;官网地址如下 https…

基于SpringBoot的音乐网站系统

本地测试环境&#xff1a;eclipse或idea&#xff0c;数据库MySQL5.7&#xff0c; jdk1.8 使用技术&#xff1a;SpringBootMyBatis 主要功能&#xff1a;分类管理、音乐管理、系统管理等

用java做一个简易版球球大作战

该界面模拟了一个简单的“吃球”游戏&#xff0c;一开始多个球在屏幕上移动&#xff0c;并检查每个大球是否可以吃掉其他小球&#xff0c;且更新状态&#xff0c;删除已经被吃掉的小球。通过图形绘制和逻辑处理实现了游戏的基本功能。 主界面World.java package gzeu.test.da…

Vue基础练习|ref

<script setup> import {ref} from "vue" const msgref("Hello Vue") </script> <template><div><h1>{{msg}}</h1><input v-model"msg"></div> </template>

家庭网络中,路由器和交换机的连接顺序

家庭网络中路由器和交换机的先后连接顺序 是由你的用网需求决定&#xff01; 光纤入户首先连接的肯定是光猫&#xff0c;而在光猫的后面&#xff0c;是先连接交换机&#xff1f;还是应该接路由器呢&#xff1f; 答案是&#xff1a;都可以 情况一&#xff1a;先连交换机&…

Nuxt.js 应用中的 app:mounted 钩子详解

title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: app:mounted 钩子在 Vue 应用的生命周期中扮演着重要角色,提供了在组件被挂载后的执行时机。通过合理利用这个钩子,我们能够提高组件的交互性、用户体验以及…

使用bert模型进行命名实体识别任务

一、实验内容 本实验使用预训练的 BERT 模型进行命名实体识别&#xff08;NER&#xff09;任务&#xff0c;并且使用 Hugging Face 的 Transformers 库完成模型的训练、验证和测试。最后&#xff0c;使用测试集评估模型性能&#xff0c;计算NER指标。 二、算法介绍 Bert是一种…

Oracle 11g RAC 节点异常重启问题分析

一、背景 在国庆期间巡检的时候&#xff0c;发现数据库alert日志中出现了异常重启的信息&#xff0c;当即对该报错进行分析处理。 二、处理过程 &#xff08;1&#xff09;数据库告警日志分析 node1 alert&#xff1a; Sat Oct 05 13:05:14 2024 Thread 1 advanced to log …

前端模块化进化史:从全局 function 到 ES Modules

目前&#xff0c;前端开发已经离不开由 CommonJS、ES Modules 和 Webpack 构建的模块化开发环境。无论是 JavaScript、CSS、图片还是其他资源&#xff0c;都可以作为一个模块来处理。那么&#xff0c;模块化究竟是如何发展到今天的呢&#xff1f; 全局函数模式 最初的前端模块…

C# 属性和方法

本课要点&#xff1a; 1、属性的使用 2、方法的使用 一 数据安全问题 示例 static void Main(string[] args) {Student stu new Student();stu.age -2; }二 属性 private int age; //年龄 public int Age {get { return age; }set{if (value > 0 && value <…

JavaEE: 深入解析HTTP协议的奥秘(2)

文章目录 HTTP认识 URLURL encode 介绍 认识 "方法"(method)GETPOST其他方法 HTTP JavaEE: 深入解析HTTP协议的奥秘(1) 书接上文~ 认识 URL 平时我们俗称的"网址"其实就是说的 URL .(唯一资源定位符) URL 不是 HTTP 专属的,很多协议都会用到. 其实除了 …

软考-程序设计语言基础

一、程序设计语言概述 (一)程序设计语言的基本概念 1. 程序设计语言的目的 为了书写计算机程序而人为设计的符号语言&#xff0c;用于对计算过程进行描述、组织和推导。 2.低级语言 机器语言&#xff1a; 机器语言是计算机最原始的语言&#xff0c;由0和1的代码构成 计算机…

You must konw JS!!(超详细的javascript套餐,适合计算机专业有基础的,包含常见前端开发面试题)

1.起源 JavaScript 起源于 1995 年&#xff0c;当时它主要是为了满足网页交互的需求而被创建。它最初的设计目的是为了让网页开发者能够在网页中添加一些简单的交互效果和动态内容。在那个时期&#xff0c;网页大多是静态的&#xff0c;而 JavaScript 的出现为网页带来了新的活…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…

助动词的分类及其缩略形式

助动词的分类及其缩略形式 1. 助动词 (auxiliary verb)2. 基本助动词 (primary auxiliary)2.1. 基本助动词 be、do 和 have2.2. 实义动词 be、do 和 have 3. 情态助动词 (modal auxiliary)3.1. 情态助动词取代情态动词 4. 半助动词 (semi-auxiliary)4.1. 不能与 it ... that-cl…

MoveIt2-humble----Planning Around Objects(a)

4.Pick and Place with MoveIt Task Constructor 本节教程会教你创建一个功能包&#xff0c;使用MoveIt Task Constructor规划一个抓取和放置的操作。MoveIt Task Constructor 提供了一种方式&#xff0c;去规划由多种不同子任务&#xff08;也称为阶段&#xff09;所组成的任…

详解Redis分布式锁在SpringBoot的@Async方法中没锁住的坑

背景 Redis分布式锁很有用处&#xff0c;在秒杀、抢购、订单、限流特别是一些用到异步分布式并行处理任务时频繁的用到&#xff0c;可以说它是一个BS架构的应用中最高频使用的技术之一。 但是我们经常会碰到这样的一个问题&#xff0c;那就是我们都按照标准做了但有时运行着、…