- 博客(53)
- 收藏
- 关注
原创 2025.12.18 二叉搜索树中的众数 & 二叉搜索树中的众数
从低向上遍历,如果目标子节点分别在左右子树中,当前节点为公共祖先。如果当前节点是目标子节点,且另一个目标子节点在左子树或右子树中,则当前节点是公共祖先。方法一:二叉搜索树中序遍历是有序数组,遍历过程中记录出现怨怒是出现的次数。find_node返回目标子节点是否在当前子树中。方法二:直接计数,排序。
2025-12-18 17:15:50
123
原创 2025.12.15 验证二叉搜索树 & 二叉搜索树的最小绝对差
设置两个阈值,遍历每个节点的时候,单独判断当前节点是否在阈值区间内,初始阈值为无穷小和无穷大,左子树收缩右值,右子树收缩左值。收缩的值为当前节点的值。中序遍历在二叉搜索树中十分重要,对二叉搜索树中序遍历,可以获得一个有序数组。
2025-12-15 18:11:44
151
原创 2025.09.30 根据中序后序遍历构建二叉树 & 最大二叉树
3. 根据中序遍历数组中root节点的绝对索引值,计算出左右子树的大小,在后序遍历数组中切割,获得左右子树对应的后序遍历数组。当前节点的左子树在当次迭代中确定,循环弹出栈顶元素,直到找到栈顶最后一个小于当前节点值的元素,将其作为左子树。节点的右子树在之后的遍历迭代中确定,在迭代的过程,栈顶元素若大于当前节点的值,则将当前节点复制给栈顶右子树。1. 先用dic记录中序遍历数组的映射,方便快速找到root节点对应的绝对索引。2. 中序遍历中root节点左边的是左子树的中序遍历,右边是右子树的中序遍历。
2025-09-30 13:15:43
229
原创 2025.09.26 完全二叉树的节点数 & 平衡二叉树 & 二叉树的所有路径
对于完全二叉树的节点数,可以使用公式计算 2 ** height + 1,利用左子树和右子树的高度比较来判断哪个子树是完全二叉树。后序遍历 + 剪枝,若任一子树中出现不平衡的情况,则返回 -1,终止迭代。
2025-09-26 17:19:49
587
原创 2025.09.17 翻转二叉树 & 对称二叉树 & 二叉树的最大深度
【代码】2025.09.17 翻转二叉树 & 对称二叉树 & 二叉树的最大深度。
2025-09-17 18:01:21
195
原创 2025.09.09 前k个高频元素
方法3:快速排序,当选中元素经过快排程序之后,若是正好位于k-1的位置,则前k个元素已经找到;若是 i < k-1 则需要在数组 i 位置的后面迭代快排;若是 i > k - 1 则需要在数组 i 位置的前面迭代。方法2:用堆的方式,维护一个大小为k的小顶堆,每次push进一个元素,pop出一个最小的元素。实现方式1:使用 heapq.nlargest(k, []) 函数。方法1:用python3的 collections 模块。实现方式2:使用 heapq 手动维护堆。
2025-09-09 14:22:28
155
原创 2025.09.08 逆波兰表达式求值 & 滑动窗口的最大值
用栈,如果是数字则压栈,如果是运算符,则用栈顶的两个数字计算。python3中的 // 是向下取整,而不是向0取整,所以需要先用浮点算完之后转为 int 值。python3中没有方法判断一个字符串是否会合法整数,本题除了字符就是数字不用判断,python中判断字符串为合法整数的方法是用 try-except。单调队列,维护一个单调递减的队列,需要判断队头是否过期。这里用栈+左右指针模拟了双端队列。
2025-09-08 15:12:57
235
原创 2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
关键在于入栈,q1作为存储队列,q2作为压栈操作队列,先将元素压入q2,再按顺序将q1的元素转移到q2,同时交换q1,q2 的引用。3. deque在单线程中效率高,有多样的操作(在两端进行添加(2. queue的效率比较慢,操作只能是先进先出。1. queue是多线程安全的,deque不是。用栈的方式判断括号是否合法。) 操作时,时间复杂度为。
2025-09-05 16:15:39
313
原创 2025.09.01 重复的子串 & 用栈实现队列
若一个字符串能够被其子串重复多次构成,则说明该串循环右移小于len次,可以等于原串。代码上的实现,扩展两倍str = s + s,去除首尾字符,判断str是否包含s。用KMP算法,求next数组。
2025-09-01 16:36:10
138
原创 2025.08.24 路径加密 & 动态口令 & KMP
python中字符串类型是不可变类型,当需要对字符串进行原地修改操作时,需要提前转化为list。前缀:包含首字母不包含尾字母的所有子串;后缀:包含尾字母不包含首字母的所有子串。或者也可以使用双端队列,但是涉及到更多的数据类型转换,所以速度会慢一点。构建next数组从1开始,因为s[0] = 0,首字符不存在前后缀。KMP算法,解决字符串匹配的问题。object:找到最长相等前后缀。匹配的时候从0开始遍历。
2025-08-24 14:45:07
224
原创 2025.08.21 四数之和 & 翻转字符串1&2
剪枝:若当前最小的四个数相加大于target,则结束循环;若当前遍历的数,加上最大的数小于target,则直接进入下一次循环。思路和三数之和一样,多套一层循环,再利用左右指针遍历。相关的切片操作:s[start:end:step]
2025-08-21 13:20:30
192
原创 2025.08.19 四数相加2 & 赎金信 & 三数之和
454. 四数相加 II - 力扣(LeetCode)383. 赎金信 - 力扣(LeetCode)15. 三数之和 - 力扣(LeetCode)先排序,再用双指针的方式找到和为0的组合注意不能包含重复组合,需要判断遍历的元素是否计算过
2025-08-19 12:18:23
134
原创 2025.08.11 有效的字母异位词 & 两个数组的交集 & 快乐数
【代码】2025.08.11 有效的字母异位词 & 两个数组的交集 & 快乐数。
2025-08-11 17:45:04
184
原创 2025.08.10 两两交换链表中的节点 & 删除链表的倒数第 N 个结点 & 链表相交
这里要记得把链表结尾的空节点也遍历到,否则两个指针不可能同时为空。
2025-08-10 18:46:59
110
原创 2025.08.05 长度最小的子数组
前缀和+二分,有点复杂,思路是,先求前缀和,再遍历一遍前缀和数组,用total记录target与nums中前i个元素的和,利用二分查找到前缀和数组中大于等于total的位置,得到最小值。注意:如果ans的初始化是使用 ans = [[0] * n] * n是错误的,乘法复制的是对同一个底层对象的引用,如果一个元素变化,会导致二维数组内的多个元素发生变化。是独立的值,表面独立,实际上引用的是同一个对象,但是由于其是不可变类型,在复制的时候会创建一个新的对象,改变其引用,所以表现出独立的现象。
2025-08-05 15:22:24
178
原创 算法题-2025.08.03 二分查找 & 数的范围
将左右指针放置在有序数组的两个不可达边界,比较中间元素和target的大小,对区间进行折叠。左右指针放在不可达边界的好处是,不用判断当目标出现在左右指针上的情况,当mid被比较过后,自动成为新的边界。
2025-08-03 21:09:55
154
原创 算法题(day29)- 加油站 & 分发糖果 & 柠檬水找零
先从前先后遍历,按ratings大小比较 + 1;再从后向前遍历,需要一个取最大。这里用三个整形变量存储就行了,用字典是为了练习一下。
2025-03-27 11:27:37
129
原创 算法题(day25)- 非递减子序列 & 全排列1&2
这里mp作为flag与全排列的区别在于,在函数题内部,控制了每一层同一元素只能取一次(第一次出现的那次),即如果是4,6,6,7,那么4,6只会取index为0,1的。有重复的元素,不同的元素每层中只能取一次。
2025-03-22 13:37:27
142
原创 算法题(day22)- 组合
和全排列不同的是不需要用flag记录每个元素是否使用过,循环每次都从 i + 1 开始,保证每个元素不被重复组合。对于全排列来说,i每次都要从1开始,深度优先搜索。顺便附上一个全排列的逻辑。
2025-03-19 22:26:24
164
原创 算法题(day21)- 修剪二叉搜索树 & 将有序数组转换为二叉搜索树 & 把二叉搜索树转换为累加树
相当于把二叉搜索树按照递增数组的序列,从后累加。反向的中序遍历,可以让二叉搜索树成为递增数组序列,用一个值记录上一个节点的值,进行累加。
2025-03-18 17:43:45
141
原创 算法题(day20)- 二叉搜索树的最近公共祖先 & 二叉搜索树中的插入操作 & 删除二叉搜索树中的节点
删除后,若左右子树都不为空,需要将左子树,移动到右子树的最左节点下。对于普通二叉树,需要全部遍历。
2025-03-18 17:05:43
133
原创 算法题(day18)- 二叉搜索树的最小绝对差 & 二叉搜索树中的众数 & 二叉树的最近公共祖先
3. 循环逻辑:若当前匹配目标节点,返回当前节点,若目标节点分别在左右子树中,当前节点为最近公共祖先,返回当前节点。若两个目标节点都在其中一个子树中,则返回该子树的递归结果。1. 参数:当前节点,目标节点;返回值:空(以该节点为根的树中不存在目标节点),最近公共祖先。2. 结束条件:当前节点为空,或匹配目标节点时。用map记录每个元素出现的次数,排序后输出。层序遍历求最小绝对差。
2025-03-15 13:04:06
311
原创 算法题(day17) - 最大二叉树 & 合并二叉树 & 二叉搜索树中的搜索 & 验证二叉搜索树
用二叉搜索树的定义求解,会有很多特殊判定。可以用二叉搜索树的中序遍历的递增序列来判断。
2025-03-14 21:09:01
211
原创 算法题(day16)- 找树左下角的值 & 路径总和(1&2) & 从中序与后序遍历序列构造二叉树
循环逻辑:由于要找底层最左叶子节点,优先对左子树遍历,result的更新只会在第一次遇到比当前maxDepth大的值时进行,所以可以保证result的值是每层的最左节点。关键在于知道,后序数组的最后一个值是当前节点,中序数组的当前节点值的左边是左子树的中序数组,右边是右子树的中序遍历数组。结束条件:当前节点为叶子节点,更新最大深度,并且result赋值。参数:当前节点,当前深度。层序遍历,或者使用迭代。
2025-03-13 21:38:39
154
原创 算法题(day15)- 平衡二叉树 & 二叉树的所有路径 & 左叶子之和
1.明确参数与返回值,参数:当前节点,返回值:如果当前节点不平衡,返回-1,否则返回当前节点的最大高度。3. 明确函数逻辑,依次获得左右子树的高度,根据左右子树的高度差判断当前节点是否平衡。2. 结束条件,当前节点为空,或只有根节点一个节点时(没有左叶子节点),值为0;3. 单层递归逻辑,如果当前节点有左叶子节点,则赋值left。1. 参数,当前节点,从根节点到当前节点的路径,答案的集合。2. 结束条件,遍历到叶子节点,说明以及找到了一条路径。2. 明确递归结束条件,遍历到空节点时,高度为0;
2025-03-12 19:43:53
187
原创 算法题(day14)- 翻转二叉树 & 对称二叉树 & 二叉树的最大深度 & N 叉树的最大深度 & 二叉树的最小深度
【代码】算法题(day13)- 翻转二叉树 &
2025-03-11 14:10:21
222
原创 算法题(day13)- 树的前中后序遍历 & 层序遍历
迭代实现:前序遍历:读值,右子树不为空,先入栈,左子树不为空再入栈。后序遍历就是将前序遍历的答案翻转。
2025-03-10 14:25:00
250
原创 算法题(day12)- 分割等和子集
状态转移 dp[i][j] = dp[i - 1][j](取) || dp[i - 1][j - nums[i]](不取);如果 j < nums[i] 只能不取。需要提前判断,总和是否为偶数(若为奇数,int在除2时会发生不一致,并且奇数不可能被分割为两个相对的子集和),数组中的最大值是否超过总和的一半(dp会越界)。用动态规划,dp[i][j]:表示下标为前 i 个数组元素,能否表示数值 j;
2025-03-09 18:51:56
271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅