- 博客(16)
- 收藏
- 关注
原创 代码随想录刷题day18|LeetCode530 二叉搜索树的最小绝对差、LeetCode501 二叉搜索树中的众数、LeetCode236 二叉树的最近公共祖先
文章是本人刷题过程中的一些笔记和理解,记录的解析不一定足够清晰,也可能存在本人暂未意识到的错误,如有问题欢迎大家指出。2、两个结点有直接或间接的父子关系,即从更靠近底层的一个结点x出发,沿着树枝向上遍历,可以访问到另一个结点y,那么它们的公共祖先则是y。因为需要返回最近公共祖先,函数返回值设为TreeNode*,如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。1、两个结点分布在另一结点x的左右子树两边,也就是说两个结点没有直接或间接的父子关系,那么它们的公共祖先则是x;
2025-01-17 14:37:37
852
原创 代码随想录刷题day17|LeetCode654 最大二叉树、LeetCode617 合并二叉树、LeetCode700 二叉搜索树中的搜索、LeetCode98 验证二叉搜索树
再者就是我想利用一个变量preVal来记录中序遍历顺序的前一个结点值(用于比对当前遍历的结点值是否比preval大,满足单调递增的要求),但是其初值的设置必须足够小,一开始我使用了INT_MIN,但是力扣的测试用例中就存在使用INT_MIN和INT_MAX作为结点值的测试点,查了点办法然后换成LONG_MIN就解决了。还有一个比较重要的优化,就是单独定义一个递归函数,并加入参数left、right,每次分隔不用定义新的数组,而是通过下标索引直接在原数组上操作。我的代码:(用迭代法中序遍历写法的版本)
2025-01-16 22:40:13
811
原创 代码随想录刷题day16|LeetCode513 找树左下角的值、LeetCode112 路径总和、LeetCode106 从中序与后序遍历序列构造二叉树
递归取的应该是。
2024-10-21 16:16:05
1739
原创 代码随想录刷题day15|LeetCode110 平衡二叉树、LeetCode257 二叉树的所有路径、LeetCode404 左叶子之和、LeetCode222 完全二叉树的节点个数
坏了,突然发现卡哥要求必须先掌握递归,可我写层序太顺手了基本没咋仔细复现递归的写法......(马上找补)
2024-10-17 22:14:41
1900
原创 代码随想录刷题day14|LeetCode226 翻转二叉树、LeetCode101 对称二叉树、LeetCode104 二叉树的最大深度、LeetCode111.二叉树的最小深度
求最小深度和求最大深度的区别在于,最大深度看的是根结点到最底部叶子结点的距离,而最小深度是根结点到最近叶子结点的距离。*文章是本人刷题过程中的一些笔记和理解,记录的解析不一定足够清晰,也可能存在本人暂未意识到的错误,如有问题欢迎大家指出。卡哥的思路有用递归的,有用队列辅助迭代的,有用栈辅助迭代的(和我自己写的那个差不多),可以去。还没看卡哥思路的时候写的,感觉改边界条件改了一个世纪,,,思路写在代码注释中。-使用迭代法的话就是学习层序遍历的时候做过这道题,完全就是层序遍历的模板写法。
2024-10-13 21:02:29
413
原创 代码随想录刷题day13|LeetCode144 145 94二叉树的前/后/中序遍历(递归、迭代、统一迭代)、LeetCode102 二叉树的层序遍历
这种基础定义代码,要熟练到手撕代码能信手拈来的程度🙏一定要锻炼到白纸都能写出来。
2024-09-30 13:28:52
1894
原创 代码随想录刷题day11|LeetCode150 逆波兰表达式求值、LeetCode239 滑动窗口最大值、LeetCode347 前 K 个高频元素
关于小顶堆大小比较的代码实现,需要。
2024-09-23 14:48:25
699
原创 代码随想录刷题day10|LeetCode232 用栈实现队列、LeetCode225 用队列实现栈、LeetCode20 有效的括号、LeetCode1047 删除字符串中的所有相邻重复项
文章是本人刷题过程中的一些笔记和理解,记录的解析不一定足够清晰,也可能存在本人暂未意识到的错误,如有问题欢迎大家指出。这道题也不难,利用栈先进后出的性质,栈可以作为 判断是否出现两个相邻且相同的字母 的工具。思考:也是一道不涉及算法的题,但是相比于用栈实现队列来说会稍微有些绕,主要体现在pop操作的实现。因为栈先进后出的特性,和括号匹配是适配的,外层的括号后匹配,内层的括号先匹配。栈的内部结构,栈的底层实现可以是vector,deque,list, 主要就是数组和链表的底层实现。代码说明在代码块注释中。
2024-09-19 20:49:57
884
原创 代码随想录刷题day9|LeetCode151 反转字符串中的单词、KamaCoder55 右旋字符串、LeetCode28 找出字符串中第一个匹配项下标、LeetCode459 重复的子字符串
力扣题目链接思考:完成这道题反转单词可以分解为以下几个步骤: 1、将所有多余空格去除 2、将整个串反转 3、将每个单词反转回正常顺序这道题要求的结果只保留字符串中单词之间的空格,其余空格删除,可以联系到数组part的题目 移除元素,使用快慢指针完成删除多余空格的操作。时间复杂度为O(n)。注意设置边界条件不要误删单词中间的空格(这个地方debug起来相当事多。。。*卡哥不建议使用string类的erase方法是因为,本身erase删除串内元素就是一个时间复杂度为O(
2024-09-18 20:17:49
653
原创 代码随想录刷题day8|LeetCode344 反转字符串、LeetCode541 反转字符串Ⅱ、KamaCoder54 替换数字
文章是本人刷题过程中的一些笔记和理解,记录的解析不一定足够清晰,也可能存在本人暂未意识到的错误,如有问题欢迎大家指出。但是看卡哥的解法说反转的逻辑可以用库函数......alright不过确实反转不是解题关键部分,重点在于确定反转范围的头尾。但是库函数只涉及解题过程中的一小部分,同时已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。字符串数组的操作,其实就是数组操作,不是很难,原地算法设置一个字符大小的交换空间、同时还是使用。注意,算法训练阶段,减少库函数的使用,特别是。
2024-09-12 01:58:19
671
原创 代码随想录刷题day7|LeetCode454 四数相加Ⅱ、LeetCode383 赎金信、LeetCode15 三数之和、LeetCode18 四数之和
当第一个数当前取某个值时,由于数组已变为有序数组,数组左边的元素一定较小,右边的元素一定较大,三数之和大于0时则right向左移动、小于0则left向右移动,left和right就不断向内缩小,直到取完所有合适的三元组,然后再迭代第一个数,重复滑动窗口的操作。注意不能有重复的三元组是指,不能出现所含元素完全相同的三元组,即不能为{[-1,0,1],[-1,1,0]},但是三元组中可以有数据重复(但下标不同)的元素,即{[0,0,0],[-1,-1,2]}。如果三个数组合并对比剩下一个数组,时间复杂度为O(
2024-09-11 10:05:05
614
原创 代码随想录刷题day6|LeetCode242 有效的字母异位词、LeetCode349 两个数组的交集、LeetCode202 快乐数、LeetCode1 两数之和
实现的思路是,遍历数组,并实时在map中查询是否存在 与当前遍历到的数组元素相加和为target的数(设为theOther),若不存在,则将当前数组元素及其下标插入map中,若存在,则返回一个包含 当前数组元素的下标和theOther的下标 的数组。,64+81=145,1+16+25=42,16+4=20,4+0=4(因为题目示例2直接告诉我们4不是快乐数,所以到这里已经知道17不是快乐数了),16,1+36=37,9+49=58,枚举查找集合中的元素时间复杂度为O(n),而哈希表查找的则为O(1)。
2024-09-06 16:09:08
681
原创 代码随想录刷题day4|LeetCode24 两两交换链表中的节点、LeetCode19 删除链表的倒数第N个节点、LeetCode02.07 链表相交、LeetCode142 环形链表II
这样的速度比例还有一个好处,快指针相对于慢指针以每次移动一个结点的速度追赶慢指针,不会出现赶上慢指针但是跳过慢指针而没法相遇的情况。,故需要确定相遇的结点(可在判断是否存在环的过程中求得),此时再使用两个新指针分别从相遇点和头结点同时出发(在这里k=1可以理解为两个指针的速度比例为1),直到两新指针相遇,相遇的新结点就是环入口。当链表不存在环时,快指针一定会先走完整个链表,两指针不会相遇。列个简单的相遇问题等式,由于快指针所走路程是慢指针的两倍,且在两指针相遇时快指针有可能已经转了若干圈,可得原型式。
2024-09-03 23:36:04
914
原创 代码随想录刷题day3|LeetCode203 移除链表元素、LeetCode707 设计链表、LeetCode206 反转链表
很久没写链表操作了(擦汗),顺便复习一下手搓创建、输出和删除链表结点的细节,比如避免访问被释放结点内存(heap-use-after-free on address)之类的错误。,cur负责从头到尾遍历结点,pre负责在cur后面保存cur遍历的前一个结点,temp负责保存cur未遍历到的下一个结点,确保指针在交换方向前前后结点均不丢失。用c++编程移除链表元素时,在修改结点next指针指向后,还需要手动delete移除的结点,防止内存占用过多。我的代码:(写的是单链表,有时间也写下双链表。
2024-09-01 23:26:29
625
原创 代码随想录刷题day2|LeetCode209 长度最小的子数组、LeetCode59 螺旋矩阵II、KamaCoder58 区间和、KamaCoder44 开发商购买土地
核心解法是设置一个前缀和(原数组下标从0到其他下标所在区间的元素和)数组sum,当要求某一个指定区间时,例如原数组下标2到下标5之间的区间和,可以通过sum[5]-sum[1]求得。*关于oj平台的判定,出现时间超限的问题时,要考虑减少不必要循环,并且当处理的数据量很大时,使用scanf和printf函数会比cin和cout节省运行时间。下标2到下标5之间的元素包括下标2的元素,所以减数是sum[1]而不是sum[2]。以下图n=5和n=6为例,注意到转几圈和n有关,中央是否有空缺和n的奇偶性有关。
2024-08-30 15:46:24
743
原创 代码随想录刷题day1|LeetCode704 二分查找、LeetCode27 移除元素、LeetCode977 有序数组的平方
且因为左闭右开原则,每进行一次二分时的if条件若为大于(nums[mid]>target,不包含等于),则修改区间为原区间的左半部分,同时边界也不包括右端的情况下,right可直接取mid值,因为已经在不等号判断时排除掉了下标为mid的元素,无需包含进下次循环的判断中;if条件若为小于(nums[mid]
2024-08-29 01:25:37
480
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人