【算法练习Day22】 组合总和 III电话号码的字母组合

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 组合总和 III
    • 剪枝
  • 电话号码的字母组合
  • 总结:

组合总和 III

216. 组合总和 III - 力扣(LeetCode)

组合总和3和上一期的组合思路上差不太多,用数字1-9相当于上一道组合题的1-n的范围求解答案,而这道题多了一个要想加等于一个固定的数值。

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

我们直接向数组里加入数据,因为我们暂时不能确定怎样的组合才能凑够n,所以我们当数组里元素等于k个数据时,直接判断一下,如果此时总和等于我们想要的答案,那么直接加入答案数组,否组向上一层直接返回。而下面的单层递归逻辑是我们仍然用一个start作为开始的下标来记录避免取到重复下标,将1-9每一个数都加入进来试错,直到找出正确答案。

剪枝

这道题也同样存在可以剪枝的部分,这道题可以分成两部分的剪枝,也很巧妙。

第一部分的剪枝原因在于这道题是组合求和,它给出了一个相加之和为n的组合,这个时候我们可以判定当我们此时递归的时候,sum当前组合内的值,如果大于了给定的目标值n,那么很明显我们一定要return了,因为是在1-9中取数,都是正数,怎么加也不可能找的到了。所以第一部分剪枝一定是写在判断部分的代码里,这和上一期的组合是有所区别的。

相似的剪枝是第二部分的剪枝, 仍然是采用之前的做法剪枝,path.size()是当前数组中所存的数据有几个,k-path.size()是还需要几个数字,9-(k-path.size())+1,是我们最多可以从哪个数字向下进行递归,这里的数是从1-9的,不是从数组中取数,最开始不是0而是1,所以要加1。

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

个人认为的缺陷

第一部分的剪枝是为了避免当sum>n时候继续递归,第二部分剪枝是告诉最多从哪里开始递归,第二部分的剪枝是完全根据传进答案的个数做的剪枝,与最终结果n无关。

那么当n=100时候,k=2时候我们还是无法快速的判断当前是无法找的出正确的答案的,看到这里可能会去想,如果是这种情况还是能很快的判断啊,通过第二次剪枝很快就根据k跳出递归了,那如果n很大,k也很大,但是k大也不足以凑出n呢?那还是会进行很多次递归-回溯的过程吧,做了很多次的搜索但是却一个结果都无法返回,但是好像暂时也没有其他什么方法能够比它更好用了。

电话号码的字母组合

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

这道题也是组合题,不过略有一些难度。首先我们要根据它给出的电话按键,用map或者数组将其数值所对应的字母都保存起来。然后再构思回溯函数,同样的也是创建一个结果数组,创立一个中间存数据的数组。这里我们并不需要像start一样作用的变量来指示我们下一次要走向哪一个下标,因为这里我们是同时操作多个数组,往里面加入数据,我们需要的是一个变量告诉我们该遍历哪一个电话按键了它指向的是传进来的电话号码序列的下标。

由于这样的缘故,所以我们结束条件可以确定是该变量等于函数传进来的电话号码字符串的字符个数,这里有一些疑问,为什么我们这个这个变量是表示下标你还要它等于字符序列总个数呢?而不是总序列个数减一,原因是我们在遍历到最后一个字符时我们仍然需要将最后一个数字对应的字母排列进来,而不是直接跳出循环,所以我们要等待它这个下标指向最后一个字符的下一个时候,才能来做判断。当它与字符序列的个数相等时我们收获结果,并想上一层返回,以寻求其他结果。

class Solution {
public:string lettermap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> result;string s;void backtracking(const string& digits,int index){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++){s.push_back(letters[i]);backtracking(digits,index+1);s.pop_back();}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if(digits.size()==0){return result;}backtracking(digits,0);return result;}
};

这里有一些需要我们注意的,我们要在循环内创立一个整形来存储该字符序列的某个位置它所代表的数字是什么,然后才是用另一个字符串变量来记录该数字所对应的字母序列,我们仅需要一个变量来指示下标的原因在上面已经说过了,而当它返回到上一层之后,我们如何找到上一次对应的电话号码的字母的下一位呢?这是递归返回后i++所要做的事情,我们完全不需要担心,其他的单层逻辑和那些组合题大体一样,不做赘述。

总结:

今天我们完成了组合总和 III\电话号码的字母组合两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

深入理解React中的useEffect钩子函数

引言&#xff1a; React是一种流行的JavaScript库&#xff0c;它通过组件化和声明式编程的方式简化了前端开发。在React中&#xff0c;一个核心概念是组件的生命周期&#xff0c;其中包含了许多钩子函数&#xff0c;用于管理组件的不同阶段。其中之一就是useEffect钩子函数&…

LuaJit交叉编译移植到ARM Linux

简述 Lua与LuaJit的主要区别在于LuaJIT是基于JIT&#xff08;Just-In-Time&#xff09;技术开发的&#xff0c;可以实现动态编译和执行代码&#xff0c;从而提高了程序的运行效率。而Lua是基于解释器技术开发的&#xff0c;不能像LuaJIT那样进行代码的即时编译和执行。因此&…

系统架构与Tomcat的安装和配置

2023.10.16 今天是学习javaweb的第一天&#xff0c;主要学习了系统架构的相关知识和原理&#xff0c;下载了web服务器软件&#xff1a;Tomcat&#xff0c;并对其进行了配置。 系统架构 包括&#xff1a;C/S架构 和 B/S架构。 C/S架构&#xff1a; Client / Server&#xff0…

离散数学 学习 之 递推方程和生成函数

递推方程 注意这里的特征根一定不是相等 特解的话一般要去设出基本的形式 这是0 次多项式 生成函数

【JAVA】集合与背后的逻辑框架,包装类,List,Map,Set,静态内部类

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 collectionCollection创建collection使用泛型collection方法 Map 接口Map的存储结构HashMap和Tr…

lenovo联想笔记本ThinkPad系列T15p或P15v Gen3(21DA,21DB,21D8,21D9)原厂Win11系统镜像

下载链接&#xff1a;https://pan.baidu.com/s/1V4UXFhYZUNy2ZQ8u4x1AFg?pwdqz0s 系统自带指纹驱动、人脸识别驱动、显卡、声卡等所有驱动、出厂主题壁纸、Office办公软件、Lenovo联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO …

一篇文章带你搞定所有二叉树题型的递归思维(思路超详细)

文章目录 &#x1f380;前言&#xff1a;&#x1f3c5;先在开头总结一下&#xff0c;二叉树解题的思维模式分两类&#xff1a;&#x1f387;先解释一下“前序位置”&#xff0c;“后序位置”的意思&#x1f3e8;举一个简单的例子&#xff1a; &#x1fa80;下面通过两道例题&am…

从自动化到测开,测试人员逆袭之路从此起步

在当今竞争激烈的软件测试行业中&#xff0c;近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位&#xff0c;许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是&#xff0c;连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

C# 图解教程 第5版 —— 第4章 类型、存储和变量

文章目录 4.1 C# 程序是一组类型声明4.2 类型是一种模板&#xff08;*&#xff09;4.3 实例化类型4.4 数据成员和函数成员4.5 预定义类型4.6 用户定义类型4.7 堆和栈&#xff08;*&#xff09;4.8 值类型和引用类型4.9 变量4.9.1 变量声明4.9.2 多变量声明&#xff08;*&#x…

模式植物背景基因集制作

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 关于GO背景基因集文件的制作&#xff0c;我们在很早以前也发过。近两天&#xff0c;自己在分析时候&#xff0c;也是被搞了头疼。想重新制作一份GO背景基因集&#xff0c;进行富集分析。但是结果&…

排序【七大排序】

文章目录 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1基本思想&#xff1a;2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想&#xff1a;2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒…

uniapp小程序中给web-view页面添加授权弹窗(使用cover-view组件覆盖实现该功能)

效果图&#xff1a; web-view是承载网页的容器。会自动铺满整个小程序页面&#xff0c;个人类型的小程序暂不支持使用。 再看下面一个提示&#xff1a; 每个页面只能有一个 web-view&#xff0c;web-view 会自动铺满整个页面&#xff0c;并覆盖其他组件。 也就是说&#xff0c;…

云安全—云计算基础

0x00 前言 学习云安全&#xff0c;那么必然要对云计算相关的内容进行学习和了解&#xff0c;所以云安全会分为两个部分来进行&#xff0c;首先是云计算先关的内容。 0x01 云计算 广泛传播 云计算最早大范围传播是2006年&#xff0c;8月&#xff0c;在圣何塞【1】举办的SES&a…

七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

一&#xff1a;排序的概念及引入 1.1 排序的概念 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

DITA-OT 4.0新特性 - PDF themes,定制PDF样式的新方法

随着DITA-OT 4.0的发布&#xff0c;它提供了一种新的定制PDF样式方法&#xff0c;这种方法就是PDF theme。这篇文章来聊一聊这种定制PDF输出的新方法和实验结果。 在进入PDF theme细节之前&#xff0c;为各位读者梳理一下DITA-OT将DITA和Markdown发布成PDF的几种方法。 - 1 …

element ui 下拉框 选择月份和天数

一、背景 目前做的管理系统项目&#xff0c;期望实现功能为&#xff1a;设置出账周期和出账日&#xff0c;考虑使用element ui下拉框实现功能 二、所用技术 vue2element ui 三、实现效果 四、具体代码 <template><popup-frame :title"批量设置出账日" …

OJ第四篇

文章目录 链表分割环形链表有效的括号 链表分割 链接: 链表分割 虽然这个题牛客网中只有C,但是无所谓&#xff0c;我们只要知道C是兼容C的就可以了 至于说这个题的思路&#xff0c;我们就弄两个链表&#xff0c;把小于x的结点放到一个链表中&#xff0c;剩下的放到另一个链表…

2023年10月工作经验及问题整理总结

目录 1.window自带的base64加密解密 2.ElementUI修改鼠标移动到表格的背景色 3.vscode保存时几万个eslint错误 4.Git 拉取Gitee仓库报错&#xff1a;“fatal: unable to access ": Failed to connect to 127.0.0.1 port 1080: Connection r... 4.1本地查看Git是否使用…

Java版本spring cloud + spring boot企业电子招投标系统源代码

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

spark stream入门案例:netcat准实时处理wordCount(scala 编程)

目录 案例需求 代码 结果 解析 案例需求&#xff1a; 使用netcat工具向9999端口不断的发送数据&#xff0c;通过SparkStreaming读取端口数据并统计不同单词出现的次数 -- 1. Spark从socket中获取数据&#xff1a;一行一行的获取 -- 2. Driver程序执行时&#xff0c…