Day28 17电话号码的字母组合 39组合求和 40组合求和II

17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

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

         因为输入的数字的数量是不确定的,所以for循环的次数也是不确定的,这里就需要用到回溯的方法了。

         一般回溯里面,递归都是深度,for循环都是宽度。注意本题的index和之前两道题的index不太一样,因为本题不是从同一个集合里面取,而是从多个集合里面取。同时for循环的起始位置是0,因为此时不存在从同一个集合里面取相同的数的问题了。

class Solution {
private://记录对应的关系const string letterMap[10] = {" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz",};vector<string> result; //存放结果string s; //存放字符串void backtracking(string digits, int index) {if(index == digits.size()) { //index表示的是第几个数字,数字等于数字大小就停止result.push_back(s);return;}int digit = digits[index]-'0'; //将index转换为“23”里的数字string letters = letterMap[digit]; //根据数字在哈希表里面找字符串for(int i = 0; i < letters.size(); i++) {s.push_back(letters[i]); //处理backtracking(digits,index+1); //递归s.pop_back(); //回溯}}
public:vector<string> letterCombinations(string digits) {result.clear();if(digits.size()==0) return result; //特殊处理以下等于0的时候backtracking(digits, 0);return result;}
};

        本题也可以将回溯隐含在函数中,但是不建议这么写,不直观。

// 版本二
class Solution {
private:const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};
public:vector<string> result;void getCombinations(const string& digits, int index, const string& s) { // 注意参数的不同if (index == digits.size()) {result.push_back(s);return;}int digit = digits[index] - '0';string letters = letterMap[digit];for (int i = 0; i < letters.size(); i++) {getCombinations(digits, index + 1, s + letters[i]);  // 注意这里的不同}}vector<string> letterCombinations(string digits) {result.clear();if (digits.size() == 0) {return result;}getCombinations(digits, 0, "");return result;}
};

 39 组合求和

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

 这道题与之前那题的不同之处在于数字是题目给的,并且可以重复,总的来说都差不多。

 注意因为可以重复,所以递归函数里不用i+1而直接是i

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int startIndex) {if(target < 0) return;if(target == 0) {result.push_back(path);return;}for(int i = startIndex; i < candidates.size(); i++) {path.push_back(candidates[i]);target -= candidates[i];backtracking(candidates, target, i); //这里不需要i+1了因为可以重复的取target += candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {result.clear();path.clear();backtracking(candidates, target, 0);return result;}
};

         这里可以进行剪枝操作,对这个数组排完序以后,如果前面的比target大了,那么后面也就不用看了:

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int startIndex) {if(target < 0) return;if(target == 0) {result.push_back(path);return;}for(int i = startIndex; i < candidates.size() && (target-candidates[i])>=0; i++) {path.push_back(candidates[i]);target -= candidates[i];backtracking(candidates, target, i); //这里不需要i+1了因为可以重复的取target += candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {result.clear();path.clear();sort(candidates.begin(), candidates.end()); // 需要排序backtracking(candidates, target, 0);return result;}
};

 40 组合求和II

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。

本题与上一题的不同之处就是给的数组里面有重复的元素,导致后面可能重复利用这个元素,但是还不能有重复的组合。

         这里利用一个used数组,里面存放布尔型数据,如果是1就说明这个数用过。首先对题目给的数组进行排序,去重有两种形式:树层去重和树枝去重,显而易见,我们不需要数值去重,但是需要树层去重,如果此时遍历的元素和上一个相同,并且上一个元素没有被使用过(如果使用过的话说明是树枝去重了,没有回溯的话used就不会重新被置为false),此时证明正在访问的元素是回溯以后的,并不是树枝,所以直接跳过就好了。

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int startIndex, vector<bool> used) {if(target < 0) return;if(target == 0) {result.push_back(path);return;}for(int i = startIndex; i < candidates.size()&&(target-candidates[i])>=0; i++) {if(i>0 && candidates[i]==candidates[i-1] && used[i-1] == false) continue;path.push_back(candidates[i]);target -= candidates[i];used[i] = true;backtracking(candidates, target, i+1, used); used[i] = false;target += candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {result.clear();path.clear();vector<bool> used(candidates.size(), false);sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, used);return result;}
};

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

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

相关文章

一文读懂Qt信号与槽的机制

Qt的信号与槽主要是为了对象之间的信号传递&#xff0c;以达到某种交互操作的功能。我按照自己的理解逐步实现这样的效果。 步骤一&#xff1a; 第一个类&#xff08;接收者&#xff09;的成员函数实现某种功能&#xff0c;第二个类&#xff08;发送者&#xff09;定义一个对象…

抽象类,接口、代码块、final、单例、枚举

今日内容(记住语法) 抽象类 拥有抽象方法的类就是抽象类。抽象方法&#xff1a;是只有方法签名没有方法体&#xff0c;必须用abstract修饰。抽象类本身也要用abstract修饰的&#xff0c;作用是让子类继承&#xff0c;子类一定要重写抽象方法。模板思想&#xff0c;设计模板模式…

重学Java 3 变量 数据类型转换 运算符

路上难免会有许多挫折&#xff0c;你要学会应对&#xff0c;要坚不可摧 ——24.1.12 一、常量 1.概述&#xff1a;在代码的运行过程中&#xff0c;值都不会发生改变的数据 2.分类&#xff1a; 整数常量&#xff1a;所有整数&#xff0c;包含正负 小数常量&#xff1a;所有带小数…

通过 Elastic Stack 充分利用电信领域生成式 AI 的力量

作者&#xff1a;Elastic Piotr Kobziakowski, Jrgen Obermann 在瞬息万变的电信领域&#xff0c;Elastic Stack 与生成式 AI 的集成正在开创运营效率和创新的新时代。 这些技术不仅增强了网络运营&#xff0c;而且还彻底改变了各个部门的内部流程。 下面&#xff0c;我们将深入…

嵌入式必备的WEB知识

写在前面 嵌入式要学习Wed前端吗&#xff1f;答案是要的&#xff0c;不需要深入学习&#xff0c;只需要简单了解即可。为什么要学习&#xff1f; 原因如下&#xff1a; 可以远程控制和管理设备&#xff1a;通过简单的Web知识&#xff0c;嵌入式系统可以建立Web界面&#xff0c…

【Effective Objective - C】—— 熟悉Objective-C

【Effective Objective - C】—— 熟悉Objective-C 熟悉Objective-C1.oc的起源消息和函数的区别运行期组件和内存管理要点&#xff1a; 2.在类的头文件中尽量少引入其他头文件向前声明要点&#xff1a; 3.多使用字面量语法&#xff0c;少用与之等价的方法字符串字面量字面数值字…

Java--业务场景:SpringBoot 通过Redis进行IP封禁实现接口防刷

文章目录 前言具体实现步骤1. 定义自定义注解2. 编写拦截器类IpUrlLimitInterceptor3. 在WebConfig类中添加IpUrlLimitInterceptor4. 添加注解到接口上 测试效果参考文章 前言 在实际项目中&#xff0c;有些攻击者会使用自动化工具来频繁刷新接口&#xff0c;造成系统的瞬时吞…

单因素方差分析--R

任务说明 三个剂量水平的药物处理受试者&#xff0c;每个剂量水平十个受试者&#xff0c;现在收集到数据后&#xff0c;问&#xff1a; 药物剂量水平显著影响受试者的response&#xff1f; 或者不同剂量药物处理受试者有显著效果的差异吗&#xff1f; 数据 library(tidyvers…

rk3568下SoftBusDumpDeviceInfo执行错误—鸿蒙开发已解决

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了rk3568下SoftBusDumpDeviceInfo执行错误的问题。 命令行运行 SoftBusDumpDeviceInfo,测…

技术解密:如何巧妙设计层级结构,轻松解决中间节点删除的挑战?

嗨&#xff0c;大家好&#xff0c;我是小米&#xff01;今天我们要聊的话题是一个非常有趣而且挑战性的面试题&#xff1a;“数据是层级结构的&#xff0c;怎么设计方便查询和修改&#xff1f;如果删除中间一个节点&#xff0c;如何保证不改大量数据&#xff1f;”废话不多说&a…

css选择器在python中如何使用

css选择器整理&#xff1a;https://blog.csdn.net/qq_40910788/article/details/84842951 目标&#xff1a;爬取某文章网站列表&#xff1a; 基础代码如下&#xff1a; import random import time import urllib.request import redef reptileTest(url):try:my_headers [&q…

人工智能技术的应用

人工智能技术的应用&#xff1a;无人手机可以通过集成人工智能技术&#xff0c;实现语音识别、语音合成、自然语言处理等功能&#xff0c;从而实现更加智能化的交互体验。 室内定位技术的改进&#xff1a;无人手机需要准确地了解自己的位置信息&#xff0c;以便更好地为用户提…

Self-Attention

前置知识&#xff1a;RNN&#xff0c;Attention机制 在一般任务的Encoder-Decoder框架中&#xff0c;输入Source和输出Target内容是不一样的&#xff0c;比如对于英-中机器翻译来说&#xff0c;Source是英文句子&#xff0c;Target是对应的翻译出的中文句子&#xff0c;Attent…

Mybatis-Plus常用注解总结

Mybatis-Plus是一个在Mybatis基础上进行增强的ORM框架&#xff0c;提供了许多便捷的注解来简化数据库操作。本文将介绍Mybatis-Plus常用的注解以及它们的使用方法。 1. TableName TableName注解用于指定实体类对应的数据库表名。使用该注解可以省去手动编写SQL语句的繁琐过程…

深入理解虚拟DOM:原理、优势与实践

文章目录 1. DOM操作与性能问题1 DOM操作对性能的影响&#xff1a;重绘与重排2 频繁DOM操作导致的问题3 案例分析&#xff1a;传统Web应用中的性能瓶颈 2. 虚拟DOM的概念与原理1 虚拟DOM的定义2 虚拟DOM与真实DOM的关系虚拟DOM的工作原理&#xff1a;初始化、更新、对比、渲染 …

编程笔记 html5cssjs 037 CSS选择器

编程笔记 html5&css&js 037 CSS选择器 一、CSS 选择器二、CSS 元素选择器三、CSS id 选择器四、CSS 类选择器五、CSS 通用选择器小结 CSS用于处理网页的样式&#xff0c;就像一个人的装扮&#xff0c;拿来一个衣物或饰品&#xff0c;你得知道穿着在什么部位&#xff0c…

Danswer部署指南

Quickstart How to deploy Danswer on your local machine ​ Requirements gitdocker with compose (docker version > 1.13.0) ​ Setup This quickstart guide covers setting up Danswer for local execution Clone the Danswer repo: git clone https://github.com…

Mysql 数据库ERROR 1820 (HY000): You must reset your password using ALTER USER 解决办法

Mysql 5.7数据库原来一直都能正常访问&#xff0c;突然访问不了&#xff0c;查看日志提示数据库需要修改密码&#xff0c; 具体解决办法如下操作&#xff1a; Windows 下&#xff1a; mysql的bin目录下&#xff0c; mysql>use mysql; mysql>mysql -uroot -p密码; 判…

gem5学习(14):将gem5扩展到ARM——Extending gem5 for ARM

目录 一、Downloading ARM Binaries 二、Building gem5 to run ARM Binaries 三、Modifying simple.py to run ARM Binaries 四、Running gem5 五、ARM Full System Simulation An aside on FS simulations 这个是gem5-learning中Getting Started的最后一篇文章&#xff…

信创平台迁移认知误区

误区一 问题&#xff1a;应用采用JDK1.5、JDK1.6进行开发&#xff0c;是否可以迁移到信创平台的TongWeb下&#xff0c;需要用TongWeb哪个版本 &#xff1f; 错误答复&#xff1a;JDK1.5需要采用TongWeb5.0、JDK1.6需要采用TongWeb6.1、JDK1.7需要采用TongWeb7.0、最新TongWe…