- 博客(60)
- 收藏
- 关注
原创 714. 买卖股票的最佳时机含手续费
二维数组dp记录每天结束时的两种状态:第一维是天数,第二维为1和0分别是每天持有股票时的最大利润(dp[i][1])和不持有股票时的最大利润(dp[i][0])。其他初始化为0,dp[0][1]初始化为-p[0](手动买股票)。状态转移方程为:不持有股票时的最大利润为前一天不持有或卖出股票减去手续费的最大值;持有股票时的最大利润为前一天持有或买入股票的最大值。最终返回最后一天不持有股票时的最大利润(最后不能还持有股票)。时间复杂度O(n),空间复杂度O(n)。
2026-03-15 17:56:03
27
原创 968. 监控二叉树
使用后序遍历递归检查每个节点状态:0表示未覆盖,1表示有监控,2表示已覆盖。若子节点未覆盖则当前节点需安装监控,若子节点有监控则当前节点视为已覆盖,子节点全是已覆盖(剩下的)就显示未覆盖让父节点覆盖自己。最终返回所需最少监控数,确保整棵树被完全覆盖。时间复杂度为O(n),空间复杂度为O(h)(n为节点数,h为树高)
2026-03-04 14:28:02
33
原创 122. 买卖股票的最佳时机 II
时间超过了 100% 的用户 空间超过了 24.89% 的用户。具体思路:遍历一遍给出数组,只要后一天价格高于前一天,就将差价累加作为利润,遍历完了返回利润。这道题想通了比简单题还简单。说是dp,贪心,本质只是。
2026-02-28 14:14:29
344
1
原创 376. 摆动序列
先删去给定数组中连续的相同数,只留一个此数。接着再次遍历数组,数组把头,数组尾和数组中的每一个高点值和低点值记录下来,记录的这个数组长度就是答案。
2026-02-27 20:37:17
55
原创 17. 电话号码的字母组合
时间复杂度为O(nm),其中n和m分别对应3字母和4字母的数字个数。空间复杂度为O(n+m),用于存储递归栈和结果。该代码实现了一个电话号码字母组合的解决方案。4. 当达到输入数字长度时保存结果。2. 初始化结果容器和临时字符串。3. 递归构建所有可能的字母组合。1. 定义数字到字母的映射表。
2026-02-25 13:19:36
134
原创 216. 组合总和 III
通过深度优先搜索(DFS)遍历可能的数字组合,使用数组a标记已使用的数字,数组b存储当前组合。当组合长度达到k且和等于n时,将有效组合存入结果集da。最终返回满足条件的所有数字组合。
2026-02-23 18:48:44
52
原创 77. 组合
通过递归函数dfs,从1到n的数字中选择k个数的所有组合。函数维护当前组合b,当b大小达到k时存入结果。时间复杂度为O(C(n,k)),空间复杂度为O(k)递归栈空间。每次递归从当前起始点i+1继续搜索,避免重复组合。
2026-02-23 18:29:37
59
原创 538. 把二叉搜索树转换为累加树
这意味着,如果中序遍历二叉搜索树遍历过的节点依次存在一个数组里,数组就是升序的,原树中大于或等于当前结点值的节点的值之和就是数组中当前节点及更靠后的节点值之和。这样,我们就可以在反向中序遍历过程中用一个变量求和,把每个经过的节点的值赋为当前变量的值,遍历后的数就是累加树了。最好想到的就是暴力,一个节点遍历一次树,每次在遍历的过程中累加出值原树中大于或等于当前节点(当然也算当前节点喽)的值之和。再稍微优化一点,之遍历一次树,把值存在数组里,遍历数组求和,但要遍历n次数组,时间还是O(n²)。
2026-02-22 21:53:46
656
原创 108.将有序数组转换为二叉搜索树
将有序数组转换为平衡二叉搜索树。递归方法,每次选取数组中间元素作为根节点,左侧子数组构建左子树,右侧子数组构建右子树。不断二分数组确保树的高度平衡,时间复杂度为O(n)。
2026-02-22 17:36:07
46
原创 669. 修剪二叉搜索树
二叉搜索树(BST)的修剪功能。通过递归遍历树节点,移除所有值不在给定范围[low, high]内的节点。对于小于low的节点,保留其右子树;对于大于high的节点,保留其左子树。算法处理了根节点可能被移除的特殊情况,并重新连接父节点与保留的子树。最终返回修剪后的BST根节点,确保所有节点值都在指定范围内。
2026-02-22 17:06:31
39
原创 701. 二叉搜索树中的插入操作
在二叉搜索树中插入新节点。首先检查树是否为空,若空则直接创建新节点。否则通过遍历树结构,比较节点值大小决定向左或向右子树移动,直到找到合适的空位置插入新节点。时间复杂度为O(h),其中h是树的高度。该实现保持了二叉搜索树的性质,即左子树值小于父节点,右子树值大于父节点。
2026-02-21 16:42:11
55
原创 235. 二叉搜索树的最近公共祖先
在二叉搜索树中查找两个节点的最近公共祖先(LCA)。通过比较当前节点值与目标节点的值,决定向左或向右子树遍历:若当前节点值大于两个目标节点值,则向左子树移动;若小于则向右子树移动;否则当前节点即为LCA。该解法时间复杂度为O(h),h为树的高度,空间复杂度为O(1)。适用于BST的特性,即左子树节点值小于父节点,右子树节点值大于父节点。
2026-02-21 16:40:21
38
原创 104. 二叉树的最大深度
计算二叉树最大深度。x为深度初始为1(根节点算一个节点),通过递归遍历二叉树,使用全局变量ma记录最大深度,向下遍历左右子树,每向下一层深度x+1。主函数调用dg完成遍历后返回ma即可。时间复杂度O(n),空间复杂度O(h),其中h为树高。
2026-02-21 12:37:28
36
原创 530. 二叉搜索树的最小绝对差
中序遍历将节点值存入数组,使数组保持升序排列。然后遍历数组计算相邻元素的差值,返回其中的最小值。时间复杂度为O(n),空间复杂度为O(n)。
2026-02-21 12:37:20
34
原创 501. 二叉搜索树中的众数
首先通过中序遍历将节点值存入数组a,然后遍历数组统计每个值的出现频率。维护最大值ma和当前值频率c,当发现更高频率时清空结果数组b并更新ma,相同频率则直接添加。最后处理末尾元素并返回结果数组b。算法时间复杂度为O(n),空间复杂度O(n)。
2026-02-21 12:37:12
30
原创 654. 最大二叉树
我一看题目递归构建的算法都说了,干脆直接模拟了。递归参数为给出数组和可用区间的左右端点。递归中先判空,不空的话遍历可用区间,找到最大值的下标(这里注意要得不是值,是下标),最后制作这个节点,递归构造左右子树,左子树右端点改成最大值的下标减一,右子树左端点的下标改成最大值的下标加一,其余和本轮一样。
2026-02-14 14:27:00
47
原创 617. 合并二叉树
通过递归遍历两棵树的节点,当两个节点都存在时,将它们的值相加;若其中一个节点为空,则直接返回另一个节点。最终返回合并后的树根节点。算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。
2026-02-14 14:26:37
44
原创 404. 左叶子之和
我用递归处理的这道题(前序遍历)。求和递归:第一步还是先判空,空了直接退出。接下来判断左元素,先判断左元素是否为空,不空再判断是不是叶子节点(左元素的左右元素都空既叶子节点),是就计入左叶子和。最后递归左右叶子即可。时间复杂度为O(n),空间复杂度取决于递归深度。
2026-02-13 11:37:49
141
原创 110. 平衡二叉树
题目要判断二叉树是否平衡(任意节点的左右子树高度差不超过1),我用的是递归法。计算左右子树的高度差的递归:先判空,空了返回0(没高度)。如果任一子树不平衡或高度差超过1则此树不是平衡二叉树,返回-1。否则返回当前子树高度。最终通过检查根节点返回值是否为-1来确定整棵树是否平衡。时间复杂度为O(n),空间复杂度为O(h),其中h为树高。
2026-02-13 11:37:46
32
原创 55. 右旋字符串(第八期模拟笔试)
实现一个字符串循环移位功能。首先输入整数k和字符串s,计算字符串长度n。然后从第k+1个字符开始输出到字符串末尾,再输出前k个字符,完成循环移位。直接用简单的位置调整实现字符串的循环移动效果。(怎么感觉我这方法好像有点卡bug)
2026-02-13 11:37:43
34
原创 242. 有效的字母异位词
如果s的字母在t中都出现了,就是有效的字母异位词。先遍历一遍s,用桶a保存被个字母在s中出现的次数。再遍历一遍t,找到一个字母,就把a对应的位置减一。最后遍历一遍a如果t,s字母全部抵消,即a全部归零是s,t就是有效的字母异位词。
2026-02-13 11:37:36
168
原创 222. 完全二叉树的节点个数
这道题其实把树遍历一下就可以了。在此基础上每遍历到一个不空的点计数器加一,最后返回计数器的值就可以AC。时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。
2026-02-12 18:10:42
30
原创 513. 找树左下角的值
这道题要求找树最下一层最左边的值,我是递归前序遍历解法。前序遍历的顺序是“中左右”,在一层的节点,靠左的一定是先遍历到的,所以可以定义一个ma记录遍历到的最深层数,ma在找到更深的层时更新(等于时不算),在这时更新答案,就可以保证答案是最深层最靠左的了。程序只需要在遍历时加上ma和答案的更新即可。
2026-02-12 16:12:37
30
原创 226. 翻转二叉树
题目要求镜像翻转一棵二叉树,我用的是递归后序遍历。可以发现,翻转的二叉树中每一个点的左右子树都被反转了,那反转每一个点的左右子树就可以翻转一棵二叉树。对于一个节点,如果为空就退出,否则先将他的左右子树内部反转(递归),再反转左右节点(注意这里是反转节点本身,这样才能反转子树)。
2026-02-12 16:12:16
37
原创 349. 两个数组的交集
这道题可以用桶处理。先遍历nums1,用桶保存nums1中出现的数字。再遍历nums2,如果有重合就记录一下。最后遍历一遍a,把有重合标记的放入结果数组。
2026-02-12 12:58:03
343
原创 225. 用队列实现栈
题目要求使用队列来模拟栈操作,实现一个栈数据结构,我用的是单队列。pop()删除栈顶,旋转队列实现栈的后进先出特性。empty()检查栈是否为空,即检查队列是否为空。push()在栈顶添加元素,即在队尾添加元素。top()查询栈顶,直接返回队尾元素。时间复杂度较高但空间复杂度为O(n)。
2026-02-12 12:56:33
168
原创 101. 对称二叉树
判断二叉树是否对称,我用的是递归法。递归比较左右子树:如果两个节点都为空返回true。若一个为空另一个不为空,或值不相等则返回false。如果到现在还对称就继续深入,递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点(这种遍历法使比较的位置对称移动,它们两个也就位置对称了)。主函数还要记得处理一下根节点和它的左右节点。算法时间复杂度为O(n),需要遍历所有节点。
2026-02-11 14:28:03
206
原创 111. 二叉树的最小深度
这道题我用的是前序遍历。主函数进入递归和判空就可以了。递归先判断当前节点是否为空,为空的话直接返回。注意:这里不能直接更新最小深度,因为如果上一个节点只有一个子节点,它不是叶子节点,但空的子节点会进入这个分支导致更新最小深度。接下来才是更新最小深度,在当前节点的左子节点为空右子节点也为空时,才更新最小深度。最后递归遍历左右子树。完成遍历后返回最小深度mi。
2026-02-11 14:27:37
225
原创 代码测试用例144. 二叉树的前序遍历
实现二叉树的前序遍历。我用的是迭代法,即用一个固定大小的数组作为栈来存储节点,通过迭代方式(非递归)完成遍历。当访问节点时,先处理当前节点值,然后依次将右、左子节点压栈(因为出栈顺序要是左,右,所以入栈是反过来的右,左)。这样避免了递归调用的系统开销,适用于深度较大的二叉树遍历。
2026-02-10 12:34:56
129
原创 383. 赎金信
我直接用桶手搓哈希表了。先遍历t,记录每个字母的出现次数。再遍历s,遇到一个字母消掉一次出现次数,如果有不够消的就返回。242.有效的字母异位词。
2026-02-10 12:34:47
156
原创 232. 用栈实现队列
pop/peek操作查询和删除,在输出栈c为空时,将j中元素全部转移到c,然后返回c的栈顶。时间复杂度:push为O(1),pop/peek均摊O(1),空间复杂度O(n)。实现一个队列数据结构,使用两个栈来模拟队列操作。empty判断队列是否为空,即两个栈是否都为空。push操作入队,将元素压入输入栈j。用栈反转特性实现队列的先进先出特性。
2026-02-09 10:56:57
33
原创 150. 逆波兰表达式求值
实现后缀表达式的计算功能。维护一个栈(数组b)来处理运算过程:遇到数字时压入栈中,遇到运算符时弹出栈顶两个元素进行运算并将结果重新入栈。最终返回栈中唯一的计算结果。算法时间复杂度为O(n),空间复杂度为O(n)。注意这道题有多位数输入和负数输入。
2026-02-09 10:56:44
29
原创 347. 前 K 个高频元素
题目要求实现一个找出数组中出现频率最高的k个元素的函数。首先遍历给出的数组,用结构体存储元素值和出现次数。再按频率降序排序,最后返回前k个高频元素的数值(结构体存储元素值就是为了不让排序弄丢数值,还能在这里用)。时间复杂度为O(nlogn)。
2026-02-08 12:49:56
237
原创 1047. 删除字符串中的所有相邻重复项
一道可以练练栈的题,通过栈结构处理相邻重复字符。遍历字符串,使用数组a模拟栈存储非重复字符,数组c记录字符位置。当遇到重复字符时,将对应位置的字符设为空格并出栈。最后遍历原字符串,将非空字符拼接成结果字符串b返回。时间复杂度O(n),空间复杂度O(n),。
2026-02-07 12:14:20
125
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅