- 博客(76)
- 收藏
- 关注
原创 在排序数组中查找元素的第一个和最后一个位置 二分查找
请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。两次二分,找第一和最后。
2024-12-05 00:04:21
177
原创 将 x 减到 0 的最小操作数 C++滑动窗口
最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0。请注意,需要 修改 数组以供接下来的操作使用。最佳解决方案是移除后两个元素,将 x 减到 0。,返回 最小操作数;每一次操作时,你应当移除数组。最左边或最右边的元素,然后从。
2024-12-03 22:32:23
230
原创 完全二叉树的节点个数 C++ 简单问题
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
2024-09-28 23:14:54
327
原创 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-09-26 21:50:34
361
原创 移动零 C++
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。,编写一个函数将所有。
2024-09-16 23:30:03
733
原创 填充每个节点的下一个右侧节点指针 II
给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为。初始状态下,所有 next 指针都被设置为。
2024-09-13 23:49:18
535
原创 删除链表的倒数第 N 个结点
为了方便删除操作,我们可以从哑节点开始遍历 Length−n+1 个节点。当遍历到第 Length−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。我们首先从头节点开始对链表进行一次遍历,得到链表的长度 Length。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 Length−n+1 个节点时,它就是我们需要删除的节点。为了与题目中的 n 保持一致,节点的编号从 1 开始,头节点为编号 1 的节点。给你一个链表,删除链表的倒数第。
2024-09-12 23:18:18
461
原创 简单二叉树问题——合并二叉树 C++
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;3、都不空的话先把两棵树根节点值相加,然后递归合并左右子树(以第一棵树为合并后的树)null 的节点将直接作为新二叉树的节点。合并过程必须从两个树的根节点开始。2、其中有一个空返回另一个树的根节点。1、都是空树返回nullptr。返回合并后的二叉树。
2024-09-09 21:17:16
671
原创 找出字符串中第一个匹配项的下标
为了减少不必要的匹配,我们每次匹配失败即立刻停止当前子串的匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串的开始位置即可。如果所有子串都匹配失败,则返回 −1。我们可以让字符串 needle 与字符串 haystack 的所有长度为 m 的子串均匹配一次。"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。
2024-09-06 23:31:28
455
原创 简单二叉树问题——对称二叉树
而比较两棵树是否镜像对称,即一棵树的左子树和另一棵树的右子树,以及一棵树的右子树和另一棵树的左子树是否镜像对称。思路:构造一个辅助函数判断两棵树是否是镜像对称的,然后题目只要判断两棵这个树是否镜像对称。特殊判断:都是空树满足条件;其中有一棵空树不满足条件。给你一个二叉树的根节点。, 检查它是否轴对称。
2024-09-05 22:23:52
443
原创 无重复字符的最长子串 滑动窗口,精简代码
给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子串是"abc",所以其长度为 3。1因为无重复字符的最长子串是"b",所以其长度为 1。3因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke"是一个子序列,不是子串。思路1.滑动窗口,保证每个窗口里字母都是唯一的2.使用 vector<int> m 来记录一个字母如果后面出现重复时,i 应该调整到的新位置。
2024-09-04 22:49:48
361
原创 红黑树的插入 C++
通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)。3.叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点。6.从任一节点到叶子节点的所有路径都包含相同数目的黑色节点。红色节点的子节点都是黑色。
2024-09-03 22:13:08
715
原创 翻转二叉树——简单二叉树问题
思路:利用递归的思想,翻转左子树后替换右子树,翻转右子树后替换左子树。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。
2024-09-02 22:02:22
454
原创 前K个高频单词 C++
"the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,"i" 和 "love" 为出现次数最多的两个单词,均为2次。注意,按字母顺序 "i" 在 "love" 之前。出现次数依次为 4, 3, 2 和 1 次。个出现次数最多的单词。
2024-08-31 21:59:36
557
原创 简单二叉树问题——相同的树
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,编写一个函数来检验这两棵树是否相同。给你两棵二叉树的根节点。
2024-08-30 21:12:04
799
原创 二叉树的前中后序遍历 C++ 非递归
三种遍历的思路都是从跟开始遍历,将树分为根和左数,用栈存起来,根据栈的特性,改变访问根的时机。(后序要麻烦一些,因为根是最后一个被记录,所以需要记录右数是否被记录)
2024-08-29 16:26:47
460
原创 二叉树的最近公共祖先 C++
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。因为根据定义最近公共祖先节点可以为节点本身。的最近公共祖先是节点。的最近公共祖先是节点。
2024-08-28 21:46:56
505
原创 根据二叉树创建字符串 C++
初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)"。,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。空节点使用一对空括号对。
2024-08-27 22:26:06
287
原创 反转链表 II 简单链表问题
在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。下面的图展示了整个流程。执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;执行操作 ②:把 next 的下一个节点指向 pre 的下一个节点;执行操作 ③:把 pre 的下一个节点指向 next。先将 curr 的下一个节点记录为 next;
2024-08-26 21:22:19
472
原创 两数相加 链表C++
具体而言,如果当前两个链表处相应位置的数字为 n1,n2,进位值为 carry,则它们的和为 n1+n2+carry;其中,答案链表处相应位置的数字为 (n1+n2+carry)mod10,而新的进位值为 (n1+n2+carry)/10。此外,如果链表遍历结束后,有 carry>0,还需要在答案链表的后面附加一个节点,节点的值为 carry。由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0。
2024-08-25 22:55:34
523
原创 随机链表的复制
从原节点开始遍历,共分两种情况:若为当前结点cur的random为空则为空,cur的random的next是需被拷贝的新结点,当前结点的next的random是需修改的新结点。2.新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。1.每个新节点的值都设为其对应的原节点的值。
2024-08-21 22:07:22
1237
原创 合并两个有序链表
首先,我们设定一个哨兵节点 head ,这可以在最后让我们比较容易地返回合并后的链表。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 tail 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
2024-08-20 22:46:19
623
原创 反转字符串中的单词 c++ 双指针
其次,我们要将字符串中的单词反转,就是将后面的单词挪到前面。因此我们可以逆序查找单词,每找到一个单词,就追加到结果字符串之后【类似于队列先入先出,先找到单词加在最前面】。最后单词与单词之间用一个空格间隔,特别的,最后一个单词之后不需要添加空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。记录最后一个字符的位置,然后不断移动指针 end,找到空格的字符,那么 [,找到不为空格的字符,即为单词的最后字符;
2024-08-19 21:13:33
478
原创 最长公共前缀
依次遍历每个字符串,更新最长公共前缀。另一种方法是纵向扫描。纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串。输入不存在公共前缀。
2024-08-18 22:43:20
328
原创 逆波兰表达式求值 有点看不懂题
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。每个操作数(运算对象)都可以是一个整数或者另一个表达式。返回一个表示表达式值的整数。输入是一个根据逆波兰表示法表示的算术表达式。平常使用的算式则是一种中缀表达式,如。该算式的逆波兰表达式写法为。表达式中不含除零运算。
2024-08-17 21:45:08
581
原创 设计最小栈问题 c++
-> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();操作,并能在常数时间内检索到最小元素的栈。将元素val推入堆栈。获取堆栈中的最小元素。删除堆栈顶部的元素。获取堆栈顶部的元素。
2024-08-16 20:57:54
293
原创 最后一个单词的长度 简单字符串问题
由若干单词组成,单词前后用一些空格字符隔开。是指仅由字母组成、不包含任何空格字符的最大子字符串。最后一个单词是长度为 6 的“joyboy”。最后一个单词是“World”,长度为 5。最后一个单词是“moon”,长度为 4。十分简单,直接反向遍历。
2024-08-15 21:23:23
265
原创 数组中的第K个最大元素 三种方式
第三种虽然看上去更复杂,但是时间复杂度最小。请注意,你需要找的是数组排序后的第。使用priority_queue排序。你必须设计并实现时间复杂度为。个最大的元素,而不是第。使用sort直接排序。
2024-08-15 21:19:20
437
原创 有效的括号 C++栈解决
s = "()"truetrues = "(]"falsepublic:{'}', '{'}stk.pop();else。
2024-08-14 23:29:25
363
原创 长度最小的子数组 滑动窗口法(双指针) 解决
暴力法是最直观的方法。初始化子数组的最小长度为无穷大,枚举数组 nums 中的每个下标作为子数组的开始下标,对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得从 nums[i] 到 nums[j] 的元素和大于或等于 s,并更新子数组的最小长度(此时子数组的长度是 j−i+1)。如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。
2024-08-13 22:52:43
560
原创 最小栈问题
对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。
2024-08-13 22:48:03
226
原创 三数之和 双指针解决+优化
当 nums[frist] > 0 时直接break跳出:因为 nums[third] >= nums[second] >= nums[frist] > 0,即 3 个元素都大于 0 ,在此固定指针 frist 之后不可能再找到结果了。当s == 0时,记录组合[frist, second , third]至ans,执行frist ++和third --并跳过所有重复的nums[second]和nums[third],防止记录到重复组合。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。
2024-08-12 22:11:48
844
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人