自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 二叉树层序遍历的相关题目

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。,其所有叶子节点都在同一层,每个父节点都有两个子节点。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)最小深度是从根节点到最近叶子节点的最短路径上的节点数量。是指从根节点到最远叶子节点的最长路径上的节点数。题目:给定一个 N 叉树,返回其节点值的。叶子节点是指没有子节点的节点。

2024-06-27 15:40:58 463

原创 二叉树的广度优先搜索(层次遍历)

层序遍历就是从左到右一层一层地遍历二叉树。

2024-06-26 21:21:29 416

原创 二叉树深度优先搜索(非递归实现,迭代法)

如果节点为空,则将栈顶节点值放入结果数组中(中),然后弹出栈顶元素,同时遍历该节点的右子节点(右)。前序遍历的顺序是中左右,我们需要设置一个节点指针用来表示此时遍历的节点,先将该节点指针初始化为根节点,然后判断该节点指针是否为空指针,如果为空指针,则返回结果。的顺序是左中右,先访问的是二叉树顶部的节点,然后一层层向下访问,直到到达树左边的最底部,然后才开始把节点数值放进结果数组中,即。(如果该子节点不为空),把左子节点也放入栈中,然后进行下一次循环,这样就可保证下次循环先处理的是左子节点。

2024-06-26 20:43:07 476

原创 二叉树深度优先遍历(递归实现)

int val;二叉树的定义与链表有点相似,但是二叉树有两个指针,一个指向左节点,一个指向右节点。

2024-06-26 11:05:13 632

原创 栈与队列相关知识总结

答:不是,stack和queue不被归类为容器,而是被归类为container adapter(容器适配器)。答:属于SGI STL。答:他们的底层实现可以是vector、deque、list等,如果没有指定底层实现,那么默认是deque。答:不允许有遍历行为,也没有迭代器,只能通过一些接口函数来获取其中的元素。答:首先,栈是容器适配器,底层实现可以使用不同容器,导致栈内数据在内存中不一定是连续分布的。但是如果是默认情况,底层容器是deque,deque在内存中的数据分布是不连续的。

2024-06-25 16:20:47 569

原创 【栈与队列】前k个高频元素

的应用,所以这里我们很容易想到用unordered_map数组存放元素(key)及其出现频率(value)。然后我们需要根据value值进行排序,map的常用排序是根据key值进行的排序。所以我们根据value进行排序,需要将map转换为vector结构,然后对整个数组进行排序。因为我们只想要维护k个键值对,所以对于多余的键值对要用pop弹出,如果使用大顶堆就可能把出现频率高的元素弹出,而使用。最后由于小顶堆小的在前,所以在放入vector<int> result数组时要逆序放。,请你返回其中出现频率前。

2024-06-24 21:02:35 541

原创 【栈与队列】滑动窗口最大值

但是题目要求返回滑动窗口的最大值,我们应该怎么做呢?大家一般第一想法就是对元素进行排序,但是排序之后我们还需要移动滑动窗口,即需要pop队头,那我们就无法pop正常需要pop的元素,每次pop的都是最大值,因此。在pop函数设计时,由于我们有可能在push函数调用时已经pop了一些较小的元素,所以我们需要判断要pop的元素是否和队头元素相等,若相等则pop,否则说明在在push函数调用时就已经pop了,那么就不需要执行任何操作。,把比它小的元素都pop掉。的滑动窗口从数组的最左侧移动到数组的最右侧。

2024-06-24 17:14:55 326

原创 【栈与队列】逆波兰表达式

比如中缀算术表达式为:((2 + 1) * 3) = 9,将其转换为后缀表达式(["2","1","+","3","*"])之后,计算机可以根据栈的顺序对数据进行处理,不需要考虑运算符的优先级,也不用回退。按照逆波兰表达式遍历每个字符串元素,然后放入栈,遇到算符是就取出两个数进行运算,然后把结果放入栈继续进行下一步运算。返回一个表示表达式值的整数。

2024-06-24 15:34:12 166

原创 【栈与队列】删除字符串中的所有相邻重复项

首先我们遍历字符串,将遍历到的每一个字符和栈顶的元素比较,如果相同就将栈顶元素弹出;如果栈是空的或者和栈顶元素不同,就将该字符放入栈里。最后剩下的栈元素重新放在字符串里,由于顺序相反,所以还需反转一下。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。

2024-06-24 11:49:11 207

原创 【栈与队列】有效的括号

尤其题目题目中还要求左括号必须以正确的顺序闭合。我们可以在每遇到一个左括号的时候就往栈里存放一个对应的右括号,当左括号遍历完,遍历到右括号时,如果遍历到的右括号和栈顶的元素不匹配说明左括号没有用相同类型的右括号闭合。如果还没有遍历完右括号,而栈已经空了,说明有多余的右括号。如果遍历完字符串,栈还没空,说明有左括号没有对应的右括号,如果此时栈空了,说明字符串有效。非常适合处理对称匹配类的问题。,判断字符串是否有效。由于栈先进后出的特性,

2024-06-22 22:15:38 248

原创 【栈与队列】用队列实现栈

如果我们像上一篇文章用栈实现队列那样使用两个队列,一个输入队列,一个输出队列是行不通的,因为从输入栈导入输出栈,元素的进出顺序仍然没有改变。所以我们可以考虑将队列1的除最后一个元素外的所有元素先。队列2,然后把最后进入的元素输出,再把队列2中暂存的元素放回队列1,从而实现后进先出。如果想要得到栈顶元素,我们可以直接输出队列1.back()。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(,只需要在弹出元素时将除最后一个元素外的其他元素均移动到队尾。

2024-06-22 21:23:45 238

原创 【栈与队列】用栈实现队列

栈提供了push和pop等接口,所有元素必须符合先进后出的规则,所以栈不能遍历,也没有迭代器。队列先进先出同样也不能遍历,不提供迭代器。队列要求先进先出,然而栈的特性是先进后出。push(x) -- 将一个元素放入队列的尾部。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。pop() -- 从队列首部移除元素。

2024-06-22 20:42:16 145

原创 双指针法的一些应用

双指针法并不隶属于某一种数据结构,在数组,链表,字符串都用到了双指针法。双指针法的关键优势在于在一个for循环下可以使用两个指针完成两个for循环的事情。

2024-06-22 11:46:07 629

原创 【字符串】常见算法题型及方法总结

字符串是若干字符组成的有限序列,可以理解为一个字符数组。在C++中提供了一个string类,那我们可能会想vector<char>和string有什么区别呢。在含义和基本操作方面基本是没有区别的,但是。前缀是指不包含最后一个字符的所有以第一个字符开头的连续字串,后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。所以我们一般会通过定义一个string类来处理字符串。1. 当需要按照固定规律一段一段处理字符串时,可以在for循环的表达式上做改变,即不一定非要使用i++4.翻转字符串里的单词。

2024-06-21 16:01:10 170

原创 【KMP算法】重复的子字符串

在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,这里拿字符串s:abababab 来举例,ab就是最小重复单位。3. 计算字符串是否可以被重复子字符串整除来判断是否可以通过该字串重复多次构成。2. 获取字符串的最长相同前后缀长度,进一步得到重复子字符串的长度。,检查是否可以通过由它的一个子串重复多次构成。搞清楚重复子串和最长相同前后缀之间的关系。用KMP算法解决这道题的关键点在于要。这题是字符串匹配问题,因此仍然可以用。1. 构造next数组。给定一个非空的字符串。

2024-06-20 17:47:04 551

原创 【字符串&&KMP算法】实现 strStr()

初始化next数组,处理前后缀不相同的情况,处理前后缀相同的情况。字符串的第一个匹配项的下标(下标从 0 开始)。KMP主要应用在字符串匹配上。本题是KMP 经典题目。2. 使用next数组匹配。1. 构造next数组。

2024-06-20 17:22:55 142

原创 【字符串】右旋字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。1. 翻转整个字符串。2. 翻转前k个字符。3. 翻转剩下的字符。

2024-06-20 16:33:02 151

原创 【字符串】翻转字符串里的单词

中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。中使用至少一个空格将字符串中的。之间用单个空格连接的结果字符串。是由非空格字符组成的字符串。1. 删除字符串中多余的空格。3. 将字符串中的单词翻转。2. 字符串整体翻转。

2024-06-20 12:08:52 161

原创 【字符串】替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。,一个从前往后遍历原有数组,一个从后往前遍历进行填写,这样可以保证填入字符的时候不会覆盖前面的原有字符。其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

2024-06-19 22:22:05 316

原创 【字符串】反转字符串Ⅱ

首先我们肯定要用for循环遍历字符串s,但这里有一个关键点,我们不一定非要用i++。通过分析题目,我们可以发现我们的操作是2k个字符执行一次操作,所以我们可以把。更新表达式设置为i += 2*k。然后我们要根据题目处理两种情况。,从字符串开头算起,每计数至。个,则将剩余字符全部反转。个字符,其余字符保持原样。写完代码后,突然发现可以简化。1. 如果剩余字符少于。2. 如果剩余字符小于。

2024-06-19 19:57:49 198

原创 【字符串】反转字符串

我们一般看到这题的第一反应是新建一个字符数组,然后从后向前遍历字符数组s,从前往后给新建的字符数组赋值,然后输出新建的字符数组。但是题目明确要求了必须原地修改输入数组,因此我们最初的想法就不能用了,那怎么可以实现原地反转字符串呢?创建两个指针,一个指向数组的首,从前向后遍历数组;一个指向数组的尾,从后向前遍历。一边遍历一边将两个指针指向的内容互换直至两指针指向同一位置。编写一个函数,其作用是将输入的字符串反转过来。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。

2024-06-19 19:32:06 246

原创 【哈希表】哈希表应用之赎金信

我们可以设置一个哈希结构,存储magazine里的字符。那应该设置哪种哈希结构呢?首先magazine里有可能又重复的元素但是我们在存入哈希结构的时候不能去重,所以。所以我们可以使用数组或者unordered_map或者unordered_multiset。

2024-06-04 12:14:35 318

原创 【哈希表】哈希表应用之四数相加

nums1[i] + nums2[j] + nums3[k] +nums4[l] == 0 ,则nums1[i] + nums2[j] = -(nums3[k] + nums4[l]),所以我们可以。unordered_map可以简单解决unordered_set存在的问题,它可以记录同样的-(nums3[k] + nums4[l])值出现的次数,因此不会漏计。,然后用双层循环遍历nums1和nums2,寻找他们的和等于 -(nums3[k] + nums4[l])的个数。,请你计算有多少个元组。

2024-06-04 11:37:18 381 1

原创 【哈希表】哈希表应用之两数之和

分析:两数之和的解法有很多种,但在这里只讨论哈希表的做法。因为我们要找到nums中满足和为target的两个数,假设这两个数是a和b,那么他们满足a+b=target,a=target-b;因此我们可以设置一个哈希表存放target-b,然后遍历nums,如果有元素等于target-b,那么就输出[a, target-a]。这里的哈希结构很明显不适合使用纯粹数组,因为我们nums中的元素值很大。但是由于set只能存储数值信息,不能存储索引信息,所以对于题目要求的返回索引信息是无法实现的。

2024-06-03 22:37:55 343

原创 哈希表的应用之快乐数

所以我们可以设置一个哈希表存放在计算过程出现的正整数。在这里我们如果使用数组,我们还需要确定正整数的范围,但是很明显这个范围可以是无穷大,所以不能使用数组。因此我们可以使用unordered_set或者unordered_map。分析:首先我们需要多次重复计算正整数的每个位置上的数字的平方和,所以我们最好。如果一个数不是快乐数,那么他会无限循环但始终不到1,即一定。题目:编写一个算法来判断一个数。专门用来解决这一问题。

2024-06-03 21:52:36 270

原创 两个数组的交集

首先我们需要设置一个哈希表,哈希表的索引是nums1中的元素,元素值是nums1中元素出现的次数。然后遍历nums2,判断nums2中的每个元素是否在nums1中出现过,如果出现过则放入输出数组中,否则直接访问下一个元素。相比于multiset,它可以控制元素不重复,更有利于交集的求解)作为哈希表,但是不能使用下标访问,只能使用迭代器访问。如果想要通过设置下标访问,可以用数组或者map类型的容器。如果使用数组需要创建record[1000],因为题目中给出了nums1和nums2的元素值的范围。

2024-06-03 21:11:22 166

原创 力扣242:有效的字母异位词

那么我们应该设置一个什么结构的哈希表呢,因为我们只需要记录字符出现的次数,而且字符可以用ASCII码表示,因此如果我们用字符-‘a'就可以把字符与0~25中的某个数对应。所以我们可以用简单的数组作为哈希表。首先我们可以设置一个哈希表,然后让字符串中的字符通过一定的处理作为哈希表的索引,然后对应元素则是字符出现的次数。中每个字符出现的次数都相同,则称。,编写一个函数来判断。

2024-06-03 17:49:09 192

原创 【哈希表】哈希表相关理论总结

哈希表(Hash table),又称散列表,是一种高效的数据结构,它能够根据关键码值(Key value)直接进行访问,而无需对数据进行排序。哈希表通过使用哈希函数(Hash function)将输入的关键码映射到表中的一个位置,以此来存取对应的数据项。理想情况下,每个键值都会被映射到表中的不同位置,这样就可以通过简单的数组索引操作实现快速的查找、插入和删除操作,平均时间复杂度为O(1)。

2024-06-01 22:23:50 986

原创 力扣142题:环形链表II

当链表有环已经确定后,我们需要知道环的起点。这里就要用到一些数学运算了,假设从head到环的入口有x个节点,从入口到fast和slow相遇的节点之间有y个节点,从相遇节点到入口有z个节点。fast每次移动两步,slow每次移动一步,也就相当于fast在以1步的相对速度接近slow,那么如果有环则一定可以追赶上slow,同样的。当slow移动到相遇的节点时,fast移动了2(x+y)步,同时也是x+y+n(y+z)步,所以。,返回链表开始入环的第一个节点。,仅仅是为了标识链表的实际情况。

2024-06-01 21:58:48 275

原创 力扣160题:链表相交

设置两个指针遍历两个链表节点,要找到两个链表相交的起始节点需要让两个链表尾部对齐,然后先让长的链表的指针遍历到与短链表对齐的位置,然后同时移动并判断两个指针是否相等。

2024-06-01 18:21:47 228

原创 力扣19题:删除链表的倒数第N个节点

我们首先设置一个虚拟头节点使得头节点一般化,然后设置两个指针fast和slow,然后先让fast移动n+1步,然后再让fast和slow同时移动,当fast移动到NULL时,slow将移动到待删除节点的上一个节点,因此只需要改变slow->next就好。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

2024-06-01 17:43:35 202

原创 力扣24题:两两交换链表中的节点

1.cur(遍历到的节点)->next = cur->next->next;在操作之前要保存cur->next,即ListNode* tmp = cur->next。题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。//此时的cur->next = cur->next->next;最后更新cur = cur->next->next;

2024-05-31 18:16:29 149

原创 力扣206题:反转链表

对于这个题目,第一反应肯定是创建一个新的链表,然后在链表里一个一个设置节点,这样操作会浪费内存空间,因为我们只需要改变链表的next指针的指向就好。我们只需要让某一节点的next指针指向他的前一个节点就好,使用双指针方法可以很简单地实现此操作。,请你反转链表,并返回反转后的链表。该题还可以使用递归方法来实现。

2024-05-31 15:48:42 140

原创 力扣707题:设计链表

然后由于上一篇讨论删除链表中的元素时我们发现设置一个虚拟头节点可以较为简单地实现删除功能,所以在这里我们也设置一个虚拟节点。此外,链表一个比较重要的属性是大小。的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。等于链表的长度,那么该节点会被追加到链表的末尾。的节点追加到链表中作为链表的最后一个元素。如果下标无效,则返回。如果下标有效,则删除链表中下标为。的节点插入到链表中下标为。然后依次实现各个成员函数。比长度更大,该节点将。

2024-05-31 12:19:36 193

原创 力扣203题:移除链表元素

分析:如果某一个节点的数据域的值为val,那么移除该链表元素只需要让前一个节点的指针域指向此节点的下一个节点。但是对于头节点来说不存在前一个节点,所以需要特别处理。,原因是有可能在链表的前几个节点数据域的值都等于val,所以删除一个头节点之后进行的删除操作仍是删除头节点。对于某一节点,如果下一节点的数据域的值为val,那么直接让本节点的指针指向下下个节点。,那么此时真正的头节点可以看作是一般节点。如果想让头节点一般化,即不特殊处理头节点,那么就需要。题目:给你一个链表的头节点。,请你删除链表中所有满足。

2024-05-30 22:48:36 146

原创 【链表】链表的定义以及基本操作的C++实现

链表的简单总结

2024-05-24 21:49:24 965

原创 My TinySTL中各个头文件的作用(5)---容器篇(vector)

定义了一个模板类vector,其中T是容器内元素的类型。

2024-05-16 21:44:02 283

原创 My TinySTL中各个头文件的作用(4)---仿函数篇

自己学习做的简单总结

2024-05-16 21:40:52 291

原创 My TinySTL中各个头文件的作用(3)---迭代器篇

这是一个模板结构体,用于生成表示编译时常量的类型。它接受一个类型参数T和一个该类型的值v,并提供一个静态成员value存储这个常量值。这是构建类型特征的基础工具。:基于的特化,用于生成表示布尔值的类型特征,如和,分别代表true和false。is_pair:这是本代码段的核心部分,定义了一个模板特化来检测类型是否为std::pair的实例。它首先为所有类型默认定义为,然后通过特化,如果类型T实际上是的形式,则定义为。这里的是对标准库std::pair的一个假设前向声明,表明在构建一个类似标准库的环境。

2024-05-08 22:03:01 789

原创 My TinySTL中各个头文件的作用(2)---内存分配篇

自学用的内存分配简单总结~

2024-05-08 21:12:36 1055

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除