- 博客(30)
- 收藏
- 关注
原创 算法题(day29)- 加油站 & 分发糖果 & 柠檬水找零
先从前先后遍历,按ratings大小比较 + 1;再从后向前遍历,需要一个取最大。这里用三个整形变量存储就行了,用字典是为了练习一下。
2025-03-27 11:27:37
87
原创 算法题(day25)- 非递减子序列 & 全排列1&2
这里mp作为flag与全排列的区别在于,在函数题内部,控制了每一层同一元素只能取一次(第一次出现的那次),即如果是4,6,6,7,那么4,6只会取index为0,1的。有重复的元素,不同的元素每层中只能取一次。
2025-03-22 13:37:27
114
原创 算法题(day22)- 组合
和全排列不同的是不需要用flag记录每个元素是否使用过,循环每次都从 i + 1 开始,保证每个元素不被重复组合。对于全排列来说,i每次都要从1开始,深度优先搜索。顺便附上一个全排列的逻辑。
2025-03-19 22:26:24
100
原创 算法题(day21)- 修剪二叉搜索树 & 将有序数组转换为二叉搜索树 & 把二叉搜索树转换为累加树
相当于把二叉搜索树按照递增数组的序列,从后累加。反向的中序遍历,可以让二叉搜索树成为递增数组序列,用一个值记录上一个节点的值,进行累加。
2025-03-18 17:43:45
102
原创 算法题(day20)- 二叉搜索树的最近公共祖先 & 二叉搜索树中的插入操作 & 删除二叉搜索树中的节点
删除后,若左右子树都不为空,需要将左子树,移动到右子树的最左节点下。对于普通二叉树,需要全部遍历。
2025-03-18 17:05:43
93
原创 算法题(day18)- 二叉搜索树的最小绝对差 & 二叉搜索树中的众数 & 二叉树的最近公共祖先
3. 循环逻辑:若当前匹配目标节点,返回当前节点,若目标节点分别在左右子树中,当前节点为最近公共祖先,返回当前节点。若两个目标节点都在其中一个子树中,则返回该子树的递归结果。1. 参数:当前节点,目标节点;返回值:空(以该节点为根的树中不存在目标节点),最近公共祖先。2. 结束条件:当前节点为空,或匹配目标节点时。用map记录每个元素出现的次数,排序后输出。层序遍历求最小绝对差。
2025-03-15 13:04:06
258
原创 算法题(day17) - 最大二叉树 & 合并二叉树 & 二叉搜索树中的搜索 & 验证二叉搜索树
用二叉搜索树的定义求解,会有很多特殊判定。可以用二叉搜索树的中序遍历的递增序列来判断。
2025-03-14 21:09:01
162
原创 算法题(day16)- 找树左下角的值 & 路径总和(1&2) & 从中序与后序遍历序列构造二叉树
循环逻辑:由于要找底层最左叶子节点,优先对左子树遍历,result的更新只会在第一次遇到比当前maxDepth大的值时进行,所以可以保证result的值是每层的最左节点。关键在于知道,后序数组的最后一个值是当前节点,中序数组的当前节点值的左边是左子树的中序数组,右边是右子树的中序遍历数组。结束条件:当前节点为叶子节点,更新最大深度,并且result赋值。参数:当前节点,当前深度。层序遍历,或者使用迭代。
2025-03-13 21:38:39
132
原创 算法题(day15)- 平衡二叉树 & 二叉树的所有路径 & 左叶子之和
1.明确参数与返回值,参数:当前节点,返回值:如果当前节点不平衡,返回-1,否则返回当前节点的最大高度。3. 明确函数逻辑,依次获得左右子树的高度,根据左右子树的高度差判断当前节点是否平衡。2. 结束条件,当前节点为空,或只有根节点一个节点时(没有左叶子节点),值为0;3. 单层递归逻辑,如果当前节点有左叶子节点,则赋值left。1. 参数,当前节点,从根节点到当前节点的路径,答案的集合。2. 结束条件,遍历到叶子节点,说明以及找到了一条路径。2. 明确递归结束条件,遍历到空节点时,高度为0;
2025-03-12 19:43:53
152
原创 算法题(day14)- 翻转二叉树 & 对称二叉树 & 二叉树的最大深度 & N 叉树的最大深度 & 二叉树的最小深度
【代码】算法题(day13)- 翻转二叉树 &
2025-03-11 14:10:21
174
原创 算法题(day13)- 树的前中后序遍历 & 层序遍历
迭代实现:前序遍历:读值,右子树不为空,先入栈,左子树不为空再入栈。后序遍历就是将前序遍历的答案翻转。
2025-03-10 14:25:00
213
原创 算法题(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
206
原创 算法题(day11)- 逆波兰表达式求值 & 滑动窗口最大值
使用map存储每个数出现的次数,赋值给vector<pair<int,int>>,用sort进行排序,sort默认对 pair.first 进行排序,所以pair.fisrt需要存频率, pair.second存数字。使用单调队列存储窗口中的最大值,单调队列由大到小排列,等值元素一起存储在队列中(等值但过期时间不同)。过期判断,当n[i - k] = q.front() 时,队头元素过期。优先队列(小顶堆)这个的使用有点没看懂。数据压栈,遇到符号进行计算。
2025-03-08 17:23:07
208
原创 算法题(day10)用栈实现队列 & 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项 & 小红的数组访问
用一个队列模拟栈,栈弹出时,取队列最后一个元素,循环size() - 1次队头弹出,插入到队尾的操作,输出第一个元素。用栈存储当前字符,遇到右类型的括号,比较栈顶是否为对应左类型括号,是则抵消将左括号弹出,否则返回false。两个栈实现队列,一个输入栈,一个输出栈,当输出栈为空且需要pop时,把输入栈的所有元素存进输出栈。
2025-03-07 15:31:40
276
原创 算法题-大厂真题
首先求出,需要多少个当前字母(cnt)才能满足子串权重大于k,再拿cnt与()中取到的数进行比较,如果小于则继续遍历,如果大于,先取前cnt个字符,ans++,再判断剩余的字符数量是否满足k的条件。关键在于,遍历到满足子串权重大于k的。
2025-03-06 21:29:15
93
原创 算法题(day9)旋转图像 & 反转字符串中的单词 & 右旋字符串 & KMP & 重复的子字符串
通过翻转实现旋转,顺时针90°旋转 = 上下翻转 + 主对角线翻转,逆时针90° = 左右翻转 + 主对角线翻转。辅对角线翻转:swap(m[ i ][ j ], m[ n - j - 1 ][ n - i - 1 ])上下翻转:swap(m[ i ][ j ], m[ n - i - 1 ][ j ])左右翻转:swap(m[ i ][ j ], m[ i ][ n - j - 1 ])主对角线翻转:swap(m[ i ][ j ], m[ j ][ i ])
2025-03-05 23:32:43
204
原创 算法题(day7)四数相加2 & 赎金信 & 三数之和 & 四数之和
由于只需要返回满足条件的个数,用哈希记录前两数组各元素合的个数,遍历后两个数组,用哈希找到相加为0的个数累加。可以排序后用数据优化,需要计算出偏移量offset,将数据offset~n + offset映射到0~n。使用哈希涉及到比较复杂的去重,所以用双指针实现。和三数之和基本一致,可以通过剪枝优化。
2025-03-04 13:50:54
204
原创 算法题(day6)-哈希 - 有效的字母异位词 & 找出字符串中第一个匹配项的下标 & 两个数组的交集 & 快乐数 & 两数之和
复习了一下KMP,求ne数组:for while if =,i是被匹配字符串的指针,j是匹配字符串的指针,遍历开始时ne[0]要初始化(显然ne[0] = -1, 这里ne数组的值整体-1),从ne[1]开始求。题目给出两个字符串都由小写字母构成,所以用一个26数组维护每个字母出现的个数即可。set插入元素的方法是insert。
2025-03-03 13:58:34
204
原创 算法题(day3)-移除链表元素 & 设计链表
虚拟头节点记录链表的头,避免额外判断头节点被删除的情况。当前节点被删除时,p向后移动,而pre不向后移动。
2025-03-01 14:10:30
103
原创 算法题(day2)-长度最小的子数组(滑动窗口)+螺旋矩阵 II+开发商买土地
右指针移动累加,当大于等于目标时,移动左指针收缩窗口。时间复杂度为O(n)
2025-02-27 11:36:35
210
原创 算法题-MarsCode寻找最大葫芦
2.从大到小枚举出现次数大于3的牌,再从大到小枚举出现次数大于2且和当前出现次数大于3的牌相异的牌,若满足不大于max条件,直接返回。1.记录每种牌出现的次数,这里把1看作14记录,存储在count数组。用了比较暴力的方法过的,可以剪枝优化。3.对于1要特殊处理一下。
2024-12-11 22:25:52
122
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人