- 博客(32)
- 收藏
- 关注
原创 101.对称二叉树解析
对称二叉树是一种特殊的二叉树结构,其左子树和右子树在结构上完全镜像对称,且对应位置的节点值相等。对称二叉树的核心特点:镜像对称:左子树是右子树的镜像值对应相等:镜像位置的节点值必须相同结构一致:左右子树的形状必须完全对应递归性质:每个子树也必须满足对称性关键要点总结:递归解法:最自然直观,通过辅助函数比较镜像子树迭代解法:使用队列或栈显式管理比较过程,避免递归栈溢出核心思想:对称性转化为两个子树的镜像对称性判断比较策略:左子树的左与右子树的右比较,左子树的右与右子树的左比较边界处理。
2025-09-17 19:21:34
646
原创 226.翻转二叉树解析
二叉树翻转是一种树结构变换操作,通过交换每个节点的左右子树来实现整棵树的镜像翻转。二叉树翻转的核心特点:镜像对称:翻转后的树是原树的镜像递归结构:每个节点都需要交换其左右子树保持结构:树的形状保持不变,只是左右对调全局变换:从根节点开始,影响整棵树的结构树结构的镜像操作递归算法的经典练习树遍历算法的基础应用关键要点总结:递归解法:代码简洁,逻辑清晰,是首选方案栈迭代:模拟递归过程,深度优先遍历队列迭代:层序遍历,适合特定场景需求核心操作。
2025-09-17 18:19:41
573
原创 239.滑动窗口最大值分析
滑动窗口是一种算法思想,通过维护一个固定大小的窗口在数组上滑动,用于解决数组或字符串的子元素问题。滑动窗口的核心特点:固定窗口大小:窗口大小在整个过程中保持不变线性移动:窗口每次只移动一个位置局部最优:在每个窗口位置都需要求解一个局部问题全局结果:将所有局部结果组合成最终答案避免重复计算,提高算法效率将暴力解法的二重循环优化为单次遍历适合处理连续子数组/子字符串问题滑动窗口最大值问题完美展示了单调队列数据结构的威力,通过巧妙的设计将朴素算法的O(nk)时间复杂度优化到O(n)
2025-09-15 14:26:06
544
原创 C++ Lambda表达式学习
Lambda是对象,不是函数:理解这一点有助于理解其行为和限制捕获决定成员:捕获列表定义了Lambda对象的数据成员时机很重要:值捕获在创建时发生,引用捕获在调用时解析生命周期管理:这是使用Lambda时最容易出错的地方。
2025-09-13 16:49:04
1081
原创 右值引用与移动语义
左值(lvalue):具有持久性身份标识的表达式,可以取地址右值(rvalue):临时性表达式,即将被销毁,无法取地址右值引用和移动语义是C++11最重要的特性之一显著提升性能:避免不必要的深拷贝实现完美转发:在模板中保持参数的值类别支持资源转移:实现高效的所有权语义向后兼容:不破坏现有代码通过正确使用移动语义,可以让程序在处理大对象时获得显著的性能提升。
2025-09-13 15:59:52
1000
原创 150. 逆波兰表达式求值
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在操作数的后面。平常使用的算式则是一种中缀表达式,如。该式的逆波兰表达式写法为。去掉括号后表达式无歧义,上式即便写成也可以依据次序计算出正确结果。适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
2025-09-13 15:07:32
459
原创 删除字符串中的所有相邻重复项(leetcode1047)
删除相邻重复项的核心在于识别和消除连续相同的字符对。这是一个典型的栈应用场景。在完成所有重复项删除操作后返回最终的字符串。,重复项删除操作会选择两个相邻且相同的字母,并删除它们。上反复执行重复项删除操作,直到无法继续删除。给出由小写字母组成的字符串。
2025-09-13 14:09:16
435
原创 用队列实现栈详解(leetcode225)
使用一个队列,在每次 push 操作后,将新加入的元素通过循环操作移动到队列前端。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(始终保持一个队列为空,另一个队列存储所有元素,通过两队列间的转移实现栈操作。你能否仅用一个队列来实现栈。
2025-09-13 11:12:50
306
原创 用栈实现队列(leetcode232)
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(你能否实现每个操作均摊时间复杂度为。,即使其中一个操作可能花费较长时间。个操作的总时间复杂度为。
2025-09-13 10:36:53
847
原创 四数之和解题思路(LeetCode 18)
排序预处理:为双指针和去重奠定基础多层去重:防止重复四元组的关键剪枝优化:减少不必要的计算溢出处理:使用long long防止整数溢出双指针技巧:在有序数组中高效查找。
2025-09-10 12:35:46
307
原创 三数之和解题思路(leetcode15)
先排序,固定第一个数,然后用双指针在剩余数组中寻找两数之和等于目标值的组合。三层循环枚举所有可能的三元组,使用set去重。,判断是否存在三元组。
2025-09-10 12:34:56
288
原创 智能指针学习
shared_ptr不能直接将this指针返回shared_ptr,需要通过派生std::enable_shared_from_this类,并通过其方法shared_from_this来返回指针,原因是std::enable_shared_from_this类中有一个weak_ptr,这个weak_ptr用来观察this智能指针,调用shared_from_this()方法是,会调用内部这个weak_ptr的lock()方法,将所观察的shared_ptr返回。
2025-09-09 18:29:41
825
原创 两个数组的交集解题(leetcode349)
给定两个数组 nums1 和 nums2,返回它们的交集。输出结果中的每个元素一定是。输出结果中的每个元素一定是。,我们可以不考虑输出结果的顺序。
2025-09-09 12:27:17
293
原创 有效的字母异位词解题思路(leetcode242)
判断两个字符串是否为字母异位词,本质上是判断两个字符串中每个字符的出现次数是否完全相同。首先判断两字符串长度是否相等,不等直接返回 false。:两个字符串包含相同的字母,但字母的排列顺序不同。比较两个字符串中每个字符的出现次数是否相同。统计每个字符在两个字符串中出现的次数。比较排序后的字符串是否相等。,编写一个函数来判断。将两个字符串分别排序。
2025-09-08 22:17:04
238
原创 环形链表II解题思路(leetcode142)
fast指针每次移动两个节点slow指针每次移动一个节点如果 fast 和 slow指针在途中相遇,说明这个链表有环。
2025-09-08 19:06:42
268
原创 设计模式学习(下)
GoF定义:保证一个类仅有一个实例,并提供该实例的全局访问点。核心理解:通过控制对象的创建过程,确保系统中某个类只存在一个实例,并为该实例提供全局访问方式。初始需求:系统需要一个全局的配置管理器来处理应用配置。第一版实现:问题分析:在实现单例模式前,需要理解C++的对象构造机制: 是拷贝构造,不是拷贝赋值编译器优先选择移动构造,其次是拷贝构造返回值优化(RVO)可能避免构造函数调用单例模式六版本完整演进版本1:基础实现(存在内存泄漏)内存布局分析:问题分析:atexit机制分析:改
2025-09-08 16:54:47
318
原创 链表相交解题思路(leetcode160)
链表相交指的是两个链表在某个节点后面共享相同的节点序列,是节点引用相同,而不是节点值相同。链表A: [4] -> [1] ----\链表B: [5] -> [0] -> [1] ----/相交起始节点:节点8(注意是节点引用,不是值)
2025-09-07 13:06:33
896
原创 两两交换链表中的节点解题思路(leetcode24)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2025-09-07 10:36:09
867
原创 反转链表(leetcode206)
给你单链表的头节点head,请你反转链表,并返回反转后的链表,即原来的头节点变成尾节点,尾节点变成头节点,所有节点的指向关系都要逆转。
2025-09-06 11:51:23
544
原创 设计链表解题思路(leetcode707)
在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。
2025-09-06 10:24:31
949
原创 移除链表元素 (LeetCode 203)
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足的节点,并返回。输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
2025-09-05 22:44:57
499
原创 螺旋矩阵II解题思路
给你一个正整数 n,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的 n × n 正方形矩阵。// 向右填充上边界。// 向下填充右边界。// 向左填充下边界。// 向下填充左边界。核心思想: 使用四个边界指针,按照。向左填充前,必须检查是否还有有效行。向上填充前,必须检查是否还有有效列。每个方向填充完立即更新边界。注意左闭又开,左开右闭。
2025-09-05 21:19:19
425
原创 设计模式学习(上)
本质定义:在软件开发中,经过验证的、用于解决在特定环境下重复出现的特定问题的解决方案。通俗理解:就像建筑师有标准的建筑设计图纸一样,程序员也有一套标准的代码组织方式来解决常见问题。GoF定义:定义一个操作中算法的骨架,将某些步骤延迟到子类实现。Template Method使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。核心理解:把算法的步骤固定下来,但允许某些步骤的具体实现可以变化。GoF定义。
2025-09-05 18:30:05
799
原创 长度最小的子数组解题思路
给定一个含有 n 个正整数的数组和一个正整数 target。找出该数组中满足其总和。{r-1}, nums_r],并返回其长度。如果不存在符合条件的子数组,返回 0。如果和 >= target,更新最小长度并跳出内层循环。如果找到了满足条件的窗口,返回最小长度。: 记录找到的最小长度,初始为无穷大。: 当前窗口内元素的和,初始为0。计算子数组 [i, j] 的和。target 的长度最小的。: 滑动窗口左边界,初始为0。时,说明当前窗口满足条件。外层循环遍历起始位置 i。内层循环遍历结束位置 j。
2025-09-05 17:28:13
385
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅