自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode572 另一棵树的子树

1.与100、101解法相同。

2025-04-12 23:03:16 28

原创 leetcode100 相同的树

思路与101完全相同。

2025-04-12 21:34:23 21

原创 leetcode101 对称二叉树

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

2025-04-12 20:51:27 170

原创 leetcode590 N叉树的后序遍历

的方式,遍历子节点没有又经过栈,从左到右遍历即可。当子节点的递归全部完成后,才会回到父节点执行。(但仍然符合后序定义,只是子节点顺序不同)。的方式,经过栈,是反转再反转,我们需要。// 子节点从左到右入栈(保证前序顺序)首先一个办法就是前序遍历结果进行翻转。:先递归所有子节点,再访问根节点。时,当前函数的执行状态(如。和循环位置)会被压入调用栈。

2025-04-12 00:10:06 293

原创 leetcode589 N叉树的前序遍历

(后进先出,LIFO)。

2025-04-11 22:20:14 213

原创 leetcode226 翻转二叉树

可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。关键在于遍历顺序,前中后序应该选哪一种遍历顺序?那么层序遍历可以不可以呢?

2025-04-10 10:52:40 100

原创 leetcode111 二叉树的最小深度

相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。如果一个子树不存在,就不能用它来计算深度(因为它不是叶子节点路径):从根节点到最近叶子节点的最短路径上的节点数量。只有当一个节点没有左右子树时,它才是叶子节点。DFS前序遍历 + 传递当前深度。

2025-04-05 23:14:09 286

原创 leetcode104 二叉树的最大深度

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度。:在递归时维护当前深度,并更新全局最大深度。:计算左子树和右子树的深度,取较大值并。

2025-04-05 17:16:21 243

原创 leetcode117 填充每个节点的下一个右侧节点指针2

解法可以直接用于 117 题,因为 BFS 不依赖于树的完美结构,而是。LeetCode 116 和 117 都是关于填充二叉树节点的。不同,117与 116 题类似,但给定的树是。链是从左到右建立的,必须先确保右侧的。的情况,导致代码比 116 题复杂。,即某些节点可能缺少左或右子节点。指针的问题,但它们的区别在于。因此,116 题的简单递归方法。(包括普通二叉树和完美二叉树)。116 题的递归解法利用了。的子节点可能不存在,导致。,需要更通用的解法(如。,可能缺失某些子节点。

2025-04-04 23:50:12 369

原创 leetcode116 填充每个节点的下一个右侧节点指针

本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了.

2025-04-03 23:10:44 128

原创 leetcode515 在每个树行中找最大值

初始化一个队列用于BFS,如果根节点存在则加入队列。如果当前节点有左子节点或右子节点,将它们加入队列。如果当前节点的值大于当前最大值,则更新最大值。处理完当前层所有节点后,将最大值加入结果列表。初始化一个变量来记录当前层的最大值。获取当前层的节点数量。

2025-04-02 15:21:08 194

原创 leetcode429 N叉树的层次遍历

在 N 叉树节点定义中,

2025-03-31 16:02:21 131

原创 leetcode637 二叉树的层平均值

【代码】leetcode637 二叉树的层平均值。

2025-03-29 23:32:00 99

原创 leetcode199 二叉树的右视图

这个条件会导致只处理一层,而不会处理所有层。这样会导致每次循环都处理同一个节点,而不是遍历当前层的所有节点。时记录当前层的最后一个节点。

2025-03-29 22:05:24 254

原创 leetcode107 二叉树的层次遍历2

这个条件会导致只处理一层,而不会处理所有层。是按值传递的,这意味着在递归过程中对。只需要将正常层次遍历的结果翻转即可。的修改不会影响外部的。始终是空的,即使你在。

2025-03-29 17:37:15 220

原创 leetcode102 二叉树的层次遍历 使用队列实现二叉树广度优先遍历

借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

2025-03-28 17:06:08 224

原创 leetcode102 二叉树的层次遍历 递归

需要注意的是,在遍历左子树或者右子树的时候,涉及到向上或者向下遍历,为了让递归的过程中的同一层的节点放在同一个列表中,对于二叉树的遍历来说,想终止,即没东西遍历了,没东西遍历自然就停下来了。层次遍历是每一层的节点从左到右的遍历,所以。即最下面一层的左右节点都为空了。

2025-03-28 16:21:15 176

原创 leetcode106 从中序与后序遍历序列构造二叉树

中序遍历的根节点左侧是左子树,右侧是右子树,后序遍历的最后一个元素为根节点。然后分别对左右子树用同样的方式递归构造下去。

2025-03-20 22:30:41 206

原创 leetcode105 从前序与中序遍历序列构造二叉树

前序遍历的第一个元素为根节点,中序遍历的根节点左侧是左子树,右侧是右子树。),如果外部代码错误地调用它,可能会导致程序崩溃或产生错误的结果。这是一种良好的编程实践,尤其是在设计类时,应该尽量遵循这种原则。是一个递归辅助函数,它依赖于特定的参数范围(例如。然后分别对左右子树重复这个方式,直至结束。的,外部代码可以直接调用它。封装实现细节,隐藏不必要的复杂性。提高代码的可维护性和可扩展性。保持类的接口简洁清晰。

2025-03-19 23:37:16 194

原创 二叉树的统一迭代法 标记法

我们以中序遍历为例,在中提到说使用栈的话,。这种方法可以叫做空指针标记法。(根 -> 左 -> 右):压栈顺序:右子节点 -> 左子节点 -> 当前节点 ->NULL。(左 -> 根 -> 右):压栈顺序:右子节点 -> 当前节点 ->NULL-> 左子节点。(左 -> 右 -> 根):压栈顺序:当前节点 ->NULL-> 右子节点 -> 左子节点。booleanfalsetrue这种方法可以叫做,样例代码见下文。这种方法更容易理解,在面试中更容易写出来。

2025-03-16 23:41:13 328

原创 leetcode145 二叉树的后序遍历

二叉树后序遍历

2025-03-12 19:09:56 91

原创 leetcode94 二叉树的中序遍历

【代码】leetcode94 二叉树的中序遍历。

2025-03-12 18:54:06 109

原创 leetcode144 二叉树的前序遍历 递归法、迭代法

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。对于二叉树的遍历来说,想终止,即没东西遍历了,没东西遍历自然就停下来了。这个很好找,前序遍历的顺序是:根、左子树、右子树。那就是当前的节点是空的,既然是空的那就没啥好遍历。

2025-03-12 18:23:51 319

原创 leetcode18 四数之和

四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。

2025-03-09 13:36:03 167

原创 leetcode454 四数相加

分别对 nums3 和 nums4 进行遍历,若 -(nums3[k] + nums4[l]) 在哈希表中,则四元组次数 +hash[-(nums3[k]+nums4[l])] 次。分别对 nums1 和 nums2 进行遍历,将所有 nums1 和 nums2 的值的和作为哈希表的 key,和的次数作为哈希表的 value。分组:nums1 和 nums2 一组,nums3 和 nums4 一组。四数相加Ⅱ的解法可以将四数分为两组,即“

2025-03-08 20:26:57 180

原创 leetcode15 三数之和

1.哈希法为了避免重复在解决(3Sum)问题时,是一个非常重要的步骤。排序不仅简化了问题的解决过程,还能帮助我们高效地处理重复元素和优化查找逻辑。

2025-03-06 17:37:27 380

原创 leetcode1 两数之和 哈希表

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。遍历 nums 数组,对于当前元素 nums[i],查询哈希表中是否存在 target - nums[i]。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。对于当前元素 nums[i],我们需要检查的是 target - nums[i]若存在,返回下标,如不存在,nums[i] 存入哈希表,继续第 2 步。是当前数字的索引,而。

2025-03-05 22:24:36 474

原创 leetcode349 两个数组的交集

求两个数组的交集,直白点儿就是【nums2 的元素是否在 nums1 中】。来存储结果,或者直接在插入结果时检查是否已经存在。中也会包含重复元素。时,没有对已经找到的重复元素进行处理。为了确保结果中不包含重复元素,可以使用。同样可以使用unordered_set。

2025-03-05 15:40:29 263

原创 leetcode202 快乐数 哈希结构 集合

map、multimap 容器都会自行根据键的大小对存储的键值对进行排序,set 容器也会如此,只不过 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。更重要的是,从语法上讲 set 容器并没有强制对存储元素的类型做 const 修饰,即 set 容器中存储的元素的值是可以修改的。但是,C++ 标准为了防止用户修改容器中元素的值,对所有可能会实现此操作的行为做了限制,使得在正常情况下,用户是无法做到修改 set 容器中元素的值的。

2025-03-05 12:31:15 321

原创 leetcode383 赎金信

【代码】leetcode383 赎金信。

2025-03-04 15:49:26 322

原创 leetcode242 哈希表

s 和 t 中每个字符出现的次数都相同,则 s 和 t 互为字母异位词。碰到这种类似什么字符出现次数啥的,如果没有思路了,都可以往哈希的思路上便一下。,就是把每一个 key 对应到 0 ~ N-1 的范围内,并且放在合适的位置。如果哈希表中的值都为 0,则 s 和 t 互为字母异位词。map(映射)存储键值对、set(集合)存储。multimap 和 multiset)遍历字符串 s,哈希表对应的字符值加。遍历字符串 t,哈希表对应的字符值减。

2025-03-04 15:16:41 155

原创 leetcode459 重复的子字符串 周期性字符串问题 KMP算法

1.移动匹配法:如果一个字符串s是周期串,则s+s的中间一定有一部分s我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。begin()返回向量头指针,指向第一个元素end()返回向量尾指针,指向向量最后一个元素的下一个位置t.find(s)是的成员函数,用于在字符串t中查找子串是一个常量,表示“未找到”或“无效位置”2.KMP法:最小重复单位就是最长相等前后缀不包含的那个部分。

2025-03-01 23:19:00 999

原创 leetcode28 找出字符串第一个匹配值的下标 KMP算法

定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。也就是碰到某个不匹配的时候,我这个模式串要从最长前缀后滑动到最长后缀的位置(其实就是比较指针 j 从最长前缀移动到最长后缀的位置)。前缀与后缀相同,所以T里面与P的后缀a匹配的那个a一定也与P中的前缀a匹配,所以直接从前缀后面的b开始匹配就行了。每次不匹配的时候,找之前已匹配部分中,模式串的。是一个指向整型数组的指针。

2025-03-01 20:13:15 382

原创 卡码54 替换数字

删除数字不用erase()函数,先遍历计算原字符串中有几个数字用asciii码比较大小判定即可;然后改变字符串尺寸=原来尺寸+数字数*5.定义双指针一个指在原字符串尾部、一个指在新字符串尾部,同时向前移动遇到数字则后面的指针插入‘r' 'e' ...'u' 'n'insert函数和erase函数会直接改变string长度。2.复杂度更低的算法。

2025-02-27 11:32:24 177

原创 leetcode151 反转字符串中的单词

尺寸变大,可以给一个填充参数。尺寸由6变大到10,4个空位填充b(默认参数为0,即NULL或者'\0')。erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。尺寸变小,改变为2,多余字符被截掉了。想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作。其实就是整体反转,再局部反转,反反得正,最后就解出来了。删除多余空格后不要忘记重新计算n!3.有、乱除非背下来估计想不好。

2025-02-26 22:50:16 226

原创 leetcode541 反转字符串2

1.我的笨思路:计算有几组完整的2k,循环交换,计算完整2k之外剩余几个元素,与k、2k不同关系下不同的处理剩余元素。当然可以将交换过程封装成一个函数。2.从头开始,如果未来k个还都在字符串中,就将当前到当前后面k个进行反转,退出本轮循环,i+2k.如果未来k个已经超出字符串,即剩余不足k个(到了结尾),就将剩余的所有反转即可。其中。

2025-02-26 18:24:51 295

原创 leetcode344 反转字符串

或者反转的部分可以直接用库函数swap()

2025-02-26 17:05:56 71

原创 字符串左旋、右旋

左旋:左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。右旋:将后面k个元素移至最前。

2025-02-26 16:49:44 210

原创 剑指offer05 替换空格 字符串

【代码】剑指offer05 替换空格 字符串。

2025-02-26 14:29:32 106

原创 leetcode71 简化路径 栈的应用

用多种ifelse失败。

2025-02-25 22:29:14 116

空空如也

空空如也

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

TA关注的人

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