- 博客(36)
- 收藏
- 关注
原创 Leetcode 222. 完全二叉树的节点个数 (C++)
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。你可以设计一个更快的算法吗?遍历树来统计节点是一种时间复杂度为。,求出该树的节点个数。层序遍历,保存节点数。
2024-05-08 13:45:32
401
原创 Leetcode 101. 对称二叉树 (C++)
比较左节点与右节点相同则递归比较左节点的左节点与右节点的右节点,左节点的右节点与右节点的左节点是否相同。你可以运用递归和迭代两种方法解决这个问题吗?给你一个二叉树的根节点。, 检查它是否轴对称。
2024-05-08 13:31:55
348
2
原创 Leetcode 226. 翻转二叉树 (C++)
交换左右节点,递归调用函数交换左右子节点。,翻转这棵二叉树,并返回其根节点。当根节点为空就遍历完了,返回。给你一棵二叉树的根节点。
2024-05-08 11:51:10
426
原创 Leetcode 94. 二叉树的中序遍历 144. 二叉树的前序遍历 145. 二叉树的后序遍历 (C++)
递归算法很简单,你可以通过迭代算法完成吗?给定一个二叉树的根节点。
2024-04-30 09:49:31
191
原创 Leetcode 150. 逆波兰表达式求值 (C++)
该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。用栈的方式,遇到符号时出栈两位,做计算将结果入栈即可。返回一个表示表达式值的整数。定义栈并实现计算过程。
2024-04-28 15:06:11
299
原创 Leetcode 1047. 删除字符串中的所有相邻重复项 (C++)
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。遍历,相同则不加,不同则加。
2024-04-28 12:20:15
247
原创 Leetcode 20. 有效的括号 (C++)
很简单的括号匹配问题,只需要用栈来实现就可以,当检测到反括号查询栈顶是否为对应的括号,是则出栈,字符串继续向后查找。不是则返回false,如果检测到括号则直接入栈。官方题解给的结构很不错,首先通过map创建一个表,反括号为key,括号为value,用count()函数查询键值是否在表中,若在表中则将栈顶元素与对应的value做比较,相同则出栈,不同则false。声明栈和map,这样方便后续维护与修改,当需要增添其他括号时可以直接修改map不用修改过多的代码。,判断字符串是否有效。
2024-04-28 11:04:45
208
原创 Leetcode 225. 用队列实现栈 (C++)
两个队列实现栈,每次入栈只需入队列A中,出栈需要将前n-1个元素出队列并存到队列B中。然后将最后一个元素出队列,再将队列B中元素出队列加入到队列A中完成操作。先将队列A的头保存到B中,然后A元素出队列,执行到剩一个元素在队列A中,此元素则是要出栈的元素。将此元素保存,出队列。然后将队列B中元素出队列入到A中。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(myStack.empty();// 返回 False。
2024-04-28 09:44:35
512
原创 Leetcode 232. 用栈实现队列 (C++)
两个栈实现队列,队列需要从头出,入队列时将元素储存在栈A里,出队列时将栈A的所有元素依次出栈,入栈到栈B中这样顺序就反过来了,此时再出栈即可模拟队列操作。pop函数,首先检查栈sOut是否为空,若不为空则直接pop栈sOut的栈顶元素,若为空则从sIn中依次取栈顶元素入栈,再执行pop栈顶元素操作。peek函数只需执行一次出队列函数,将值保存,然后再将该值入栈到栈B中,返回该值即可。当出队列时要判断栈B是否为空,若为空才开始栈的转移操作,若不为空则直接从栈B中出栈。请你仅使用两个栈实现先入先出队列。
2024-04-28 08:16:06
415
原创 Leetcode 28. 找出字符串中第一个匹配项的下标 (KMP算法) (C++)
KMP算法原理:当要查询的字符串在查询过程中出现前n项匹配,后m项不匹配时。若前n项存在i个前缀与i个后缀相同,则可以将指针移动到 i+1 的位置继续进行匹配,无需移动到字符串初始位置。"leeto" 没有在 "leetcode" 中出现,所以返回 -1。首先构建next数组,目的是一旦出现不匹配的情况,要知道指针位移到哪里。然后就是实现不停的匹配字符,不同则跳转到next数组的值的位置接着匹配。字符串的第一个匹配项的下标(下标从 0 开始)。第一个匹配项的下标是 0 ,所以返回 0。
2024-04-25 14:47:51
217
原创 KamaCoder 55. 右旋字符串(第八期模拟笔试) (C++)
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。先反转整个字符串,然后反转前n个再反转后段字符串。输出共一行,为进行了右旋转操作后的字符串。
2024-04-25 09:32:34
248
原创 Leetcode 151. 反转字符串中的单词 (C++)
如果当前遍历到的不是不是空格则进入条件语句,判断此时是否为第一个单词,如果不是第一个单词则先加入一个空格再填充后面的单词。中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。然后就是进行三部分的链接,先去除重复空格,返回resize的字符串。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。三步走,去除多余空格,反转整个字符串,以空格为断点,反转每个单词。反转后的字符串中不能存在前导空格和尾随空格。
2024-04-25 09:22:15
330
原创 KamaCoder 54.替换数字 (C++)
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。从反向遍历字符串利用双指针,一个指向老字符串的末端,一个指向新字符串的末端,当遇到字符为数字的,填入倒着的number也就是rebmun。遍历字符串,若遇到字符为数字的,在新字符串中尾部追加number字符。先统计字符串中字符为数字的字符数量,扩充原字符串空间。遍历输入的字符串,若为数字,向新字符串中追加number字符,否则追加该字符。遍历字符串,查询数字数量。
2024-04-24 16:50:07
321
原创 Leetcode 541. 反转字符串 II (C++)
每次移动2k个单位,前k个字符反转。遍历length / 2*k次,每次指针指向前k个字符的头和尾。处理尾部,长度小于k直接从n*2*k开始,length-1结束设置指针。在k与2*k之间,从n*2*k开始,n*2*k+k-1结束。开始遍历,每次移动2k个单位。,从字符串开头算起,每计数至。
2024-04-24 14:50:42
285
1
原创 Leetcode 344. 反转字符串 (C++)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。构建循环,双指针指向字符串头和尾。指针相遇或交叉则退出。双指针,交换两个指针指向的字符,指针相遇或交叉则退出。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。
2024-04-24 14:10:48
264
原创 Leetcode 18. 四数之和 (C++)
因为测试用例有nums = [0,0,0,1000000000,1000000000,1000000000,1000000000], target = 1000000000这样的数据。第一层循环,确定解的第一个元素。和三数之和不一样的是,四数之和的目标值不是固定的,因此剪枝操作要定义为nums[i] > target && (nums[i] >= 0 || target >= 0),去重依旧是一样的。第二层循环,确定解的第二位元素,如果这两位之和已经大于目标值,则再往后遍历也是无效的,直接跳出循环。
2024-04-24 13:58:47
410
1
原创 Leetcode 15. 三数之和 (C++)
对第一个元素的去重,为了使第一个[-1, -1, 2]的集合与第二个[-1, -1, 2]去重,在遍历时,选择在nums[i] == nums[i - 1] 时 continue,跳过此轮循环。在按顺序遍历数组的同时,声明两个指针,分别从当前下标的下一位以及最后一位开始遍历,当三个数组和大于0时,移动右指针,使和变小。去重只需要满足三元组不同即可,三元组内部可以有重复元素,例如(a,a,b)但结果集合不能有[[a,b,c], [a,b,c]]。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。
2024-04-24 10:30:18
281
1
原创 Leetcode 383. 赎金信 (C++)
和字母异位词一样,创建一个数组存储字母的出现次数。先遍历magazine数组,存储字符出现次数。在遍历ransmNote数组,一旦发现某个字符的数值不足,则返回false。遍历ransomNote字符串,检查数组的数值。如果数值小于0返回false,遍历结束后返回true。如果ransomNote的长度大于magazine的长度,则不可能满足条件。遍历magazine字符串,储存字符数量。
2024-04-23 13:59:10
271
原创 Leetcode 454. 四数相加 II
声明count变量,遍历3,4数组,查询map中对应的值的次数,与count累加。选择将1,2数组加和,将结果储存到map中,索引为和值,索引值为该值出现的次数。再遍历3,4数组,加和后取相反数,到map中查询该值出现的次数,将其记录累加。题目不需要返回下标,只需要返回满足条件的元组数量。,请你计算有多少个元组。遍历1,2数组,将和记录。
2024-04-23 11:46:53
202
4
原创 Leetcode 1. 两数之和 (C++)
哈希表法,遍历数组,去哈希表中找索引为target减数组当前值的索引,如果存在,则返回当前数组下标和哈希表的索引对应的值。如果不存在则将当前数组值作为索引,下标作为值存入哈希表中。循环直到遍历完数组,未找到则返回空数组。这里使用unordered_map,因为我们既要数组值也要数组下标。如果target-nums[i]在哈希表中存在,返回值与当前数组下标。但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。
2024-04-23 09:54:50
124
原创 Leetcode 202.快乐数 (C++)
查重,快慢指针或者哈希表都可以。快慢指针原理已在链表中应用过,所以这里选择哈希表方法解决问题。其实数据也是有限制的,使用数组也可以充当哈希表解决问题,这样能大大节省时间。然后不断循环更新平方和,不在哈希表里则插入到哈希表里,在哈希表里则返回false,如果平方和等于1则返回true。如果平方和不在哈希表中,则插入哈希表中。在哈希表中则返回false。但为了练习这里使用unordered_set。创建循环体,当平方和不为1时继续循环。首先写个函数,获得各位的平方和。创建各位平方和计算函数。
2024-04-23 08:27:03
298
原创 Leetcode 349. 两个数组的交集 (C++)
哈希表法,数组值的取值范围为[0,1000],不是很大,因此直接选择数组来创建哈希表,遍历两个数组,把数值作为下标,下标值设置为1。遍历另一个数组时如果数组值为1则保存该值到数组里,并把数组下标对应的值设为0。输出结果中的每个元素一定是。遍历第一个数组,给哈希表初始化。遍历第二个数组,将交集值保存。[4,9] 也是可通过的。
2024-04-22 16:45:34
236
原创 Leetcode 242. 有效的字母异位词 (C++)
哈希表,记录每个字母出现的次数。s和t仅包含小写字母。创建一个长度为26的数组,将遍历到的字母对应下标的值+1。然后再遍历另一个字符串,遍历到的字母-1。如果数组出现负值则说明两个字符串不是异位词。遍历字符串,对应字符的索引数值+1,然后遍历另一个字符串,对应索引的数值=1。如果出现负值,则返回false,如果遍历结束后未出现负值,返回true。你能否调整你的解法来应对这种情况?判断字符串是否等长,不等长则肯定不是异位词。中每个字符出现的次数都相同,则称。创建哈希表,这里以数组形式即可。
2024-04-22 16:16:31
169
原创 Leetcode 142. 环形链表 II (C++)
设置两个指针,一个每次移动一个单位,另一个每次移动两个单位,由于链表是循环的,两个指针必然会有机会指向同一个节点。当两个指针指向一个节点后,在设置一个指针从头开始遍历,两指针再次重合时,则是环的起点。指针再次到达,则链表中存在环。如果快指针与慢指针重合则声明一个新指针从头开始遍历,与慢指针相交时就是环的起点。慢指针每次移动一个单位,快指针每次移动两个单位。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。Leetcode官方题解。
2024-04-22 14:57:53
444
原创 Leetcode 面试题 02.07. 链表相交 (C++)
两个链表都从头开始遍历,遍历到末尾后,A链表的指针指向B链表的头,B链表的指针指向A链表的头。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。B指针走完B的不相交部分 与 相交部分 再走 A的不相交部分。相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。整个链式结构中不存在环。
2024-04-22 14:47:01
605
原创 Leetcode 19. 删除链表的倒数第 N 个结点 (C++)
一趟扫描实现需要用栈的方式,这里先以简单的求长度按位置删除方式解题。先求出长度,遍历到长度减去传的参数的节点,删除节点。已知长度了,剩下的就和按位置删除一样了。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。你能尝试使用一趟扫描实现吗?
2024-04-22 14:31:33
342
原创 Leetcode 24. 两两交换链表中的节点 (C++)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。创建循环,条件为当前节点或后一节点的next指针为NULL则退出,防止溢出。循环内部节点next指针互相交换地址。遍历法,指针每次跳两个节点,交换当前节点与后一个节点的位置。如果链表节点数为单数或到结尾则结束循环。声明一个虚拟头节点辅助。
2024-04-22 14:23:12
479
原创 Leetcode 206. 反转链表 (C++)
使用temp指针保存下一个遍历节点,将当前节点的next指针指向新的头节点值,然后将头节点指向当前节点。再向后移动cur指针,不断循环直到最后。建立一个新头节点,在遍历的同时保存第一个节点,剩下的就和头插一样。声明一个指针,指向第一个元素。链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?,请你反转链表,并返回反转后的链表。迭代法,遍历的同时改变指针值。
2024-04-22 14:00:40
253
原创 Leetcode 707. 设计链表 (C++)
使指针cur指向下标节点的前一个节点。新建一个指针pre指向删除节点,将cur的next指针指向cur->next->next。删除pre指向的节点,释放指针指向的内存。使指针cur遍历到下标节点的前一个节点。新节点指向cur->next,cur->next指向新节点。将新节点的next指针指向head->next,然后将head的next指针指向新节点。遍历到链表末尾,将末尾节点的next指针指向新节点。很简单的设计链表过程,主要是复习链表的C++语法。是指向下一个节点的指针/引用。这里使用单链表解题。
2024-04-22 11:24:29
536
原创 Leetcode 203. 移除链表元素 (C++)
为了统一删除头节点与非头节点操作,我们自定义一个虚拟头节点dummyHead,连接到函数输入的头节点的前方。判断指针p指向的节点是否需要删除,需要则删除,不需要则向下遍历链表。同时保持一个删除节点后释放内存的习惯。声明一个虚拟头节点dummyHead,连接到输入的头节点前方。并使用指针p作遍历指针,初始指向虚拟头节点。如果链表的第一个元素是要删除的元素需要单独定义删除头元素的操作。重新设置头节点,释放虚拟头节点的空间,将头节点返回。很基础的链表操作,函数输入的链表不包含空的头节点。给你一个链表的头节点。
2024-04-19 15:49:05
338
1
原创 Leetcode 59.螺旋矩阵 II (C++)
初始数组的第一维度从left边界开始,逐步遍历到right边界。然后第二维度从top开始,遍历到bottom边界。再反向递减遍历,直到数值大于n * n。需要定义四个边界,top, bottom, left, right。从左到右遍历,填充好数组最上边。结束后上边界向下移动。从上到下遍历,填充好数组最右边。结束后右边界向左移动。从右向左遍历,填充好数组最下边。从下向上遍历,填充好数组最左边。结束后左边界向右移动。定义外部循环条件,value小于n*n。与题目中图示一样,遇到边界则改变方向。
2024-04-19 14:51:20
237
1
原创 Leetcode 209. 长度最小的子数组 (C++)
定义输出变量sublen,子数组长度,因为需要不断找最小长度,初始声明时将长度设置为INT32_MAX,以此不断更新长度。定义输出变量sublen,子数组长度,因为需要不断找最小长度,初始声明时将长度设置为INT32_MAX,以此不断更新长度。由于暴力破解超时,考虑使用双指针法,左指针指向起点,右指针向右遍历,不断累加直到大于等于目标值。定义变量sum,目的是不断累加,当超过target的值时,则此段为一个子数组。定义变量sum,目的是不断累加,当超过target的值时,则此段为一个子数组。
2024-04-19 13:24:13
417
1
原创 Leetcode 977. 有序数组的平方 (C++)
为达成题目的进阶要求,观察测试用例1给出的数组[-4,-1,0,3,10],平方后数组变为[16,1,0,9,100]数组可以被分为两部分,[16,1]的递减数组与[0,9,100]的递增数组。将平方后更小的一项放入新数组中去,最终两个指针都走到边界时,跳出循环。构建循环查找正负分界点,当i == length 或 nums[i]>=0时退出循环,此时i坐标为第一个非负数值的数组下标。当左指针指向的数值的平方小于右指针指向的数值的平方时,将左指针指向的数值的平方放入新数组中。组成的新数组,要求也按。
2024-04-19 09:53:42
392
1
原创 Leetcode 27. 移除元素 (C++)
例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。假设数组为空,左指针为赋值坐标,每次找到非移除元素时将元素放入左指针指向下标,并向右移动左右指针。因此此题考虑双指针法,第一个指针指向需要移除的元素,第二个指针去寻找不需要被移除的元素。如果指针指向了需要删除的元素,则推进右指针,去寻找不需要删除的元素进行交换。一旦第二个指针移动到数组末尾,循环结束,返回第一个指针的数组下标。的元素,并返回移除后数组的新长度。
2024-04-18 11:57:43
526
1
原创 Leetcode 704. 二分查找 (C++)
将中间值与目标值做比较,如果目标值比中间值大,则在右半侧数组中继续查找。设置循环体,如果左边界与右边界重合(此时mid = (min+max)/2赋值后mid = max = min)或交叉,说明查找已到尽头。找出数组中间位置的值,将数组分成两半,由于是有序数组(题目中是升序),因此左半部分一定比中间值小,右半部分一定比中间值大。如果目标值小于中间值,移动右边界(中间值已经被比较过,所以max = mid - 1)。如果目标值大于中间值,移动左边界(中间值已经被比较过,所以min = mid + 1)。
2024-04-18 10:13:39
366
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人