- 博客(78)
- 收藏
- 关注
原创 今日十题:最大子数组的和
递推公式:dp[i] = max(dp[i-1]+nums[i], nums[i])初始化dp[0] = nums[0], res = dp[0]dp[i],表示以nums[i]为结尾的子数组的最大值。
2025-07-30 14:40:33
55
原创 今日十题:560.和为k的子数组的个数
处理细节问题,可能某个前缀和本身等于k,所以首先要在表里插入0,即。遍历数组每次计算完当前下标对应的前缀和pre2,就查看是否存在。可以用一个表来存已经计算过的前缀和pre1及。前缀和的差值一定是连续子数组的和。
2025-07-30 14:38:39
234
原创 76. 最小覆盖子串
然后还需要我们找的是满足条件的最小窗口,所以还要记录最小窗口的。滑动窗口类型的问题中都会存在两个指针,一个用于。我们依据什么条件来判断窗口是否符合覆盖子串呢?
2025-07-30 14:34:03
84
原创 今日十题:438.找到字符串中所有字母异位词
使用哈希表来充当窗口,字母a对应的下标就是0,z对应的就是25。然后遍历s,当窗口大小等于模式串大小时判断二者是否一致。首先为模式串p建立一个哈希表用来作为判断标准。解法:滑动窗口 + 双指针+哈希。当窗口大小大于模式串大小移动窗口。
2025-07-30 14:28:11
88
原创 今日十题:3.无重复最长子串
当我们发现右指针指向的元素已经出现在窗口中,就不断收缩窗口直到把重复元素移除。滑动窗口一般都有两个指针,一个用来收缩窗口,一个用来延申窗口。首先判断是否为重复元素,是就不断收缩窗口直到,把重复元素移除。解法:双指针+滑动窗口。
2025-07-30 14:25:08
53
原创 今日十题:56. 合并区间
解法:先排序(贪心)思想;首先给intervals的所有区间按照区间起点进行排序以第一个区间的左顶点和右顶点为起点和终点{start,end}然后从第二个区间开始遍历,如果有重叠就更新end否则将区间放入结果集,并且更新起点和终点遍历完所有数组,将最后一个区间放入结果集时间复杂度O(nlogn)
2025-07-30 14:22:39
125
原创 K个一组翻转链表
为了方便没有再每次翻转后计算剩余节点的数量,题目说明了k<=链表长度len,可以直接计算需要翻转的次数。翻转的操作是在原链表上完成的,所以有几个关键变量是要记住的。
2025-07-28 11:20:24
134
原创 LRU算法
能够访问cache中的某个key,且刚被访问过的键值对要放在队首 综上,能够在任意位置快速的插入和删除元素。-最近最久未使用,基于页面的最近的使用历史,选择最长时间没有被使用的页面进行置换。链表是支持快速插入和删除的,那么哈希表能帮助我们快速定位到要执行操作的位置。每次默认从链表尾部添加元素,尾部的元素是最近使用的,头部则是最久未使用的。LRU是一种缓存淘汰策略,淘汰最近未被使用的缓存(缓存的空间是有限的)cache要有时序,容量满在执行插入操作时要淘汰最久未使用的键值对。LRU也是数据库中常用的一种。
2025-06-21 12:47:18
269
原创 I/O复用:select、poll、epoll
select没有将fd和事件进行绑定,通过三个参数分别传入可读、可写及异常等事件,告诉内核监听fd上的哪些事件。每次传入用户感兴趣的事件(事件集,统一处理所有事件类型(内核同时监听fd上的感兴趣的所有事件类型)),内核通过修改pollfd.revents反馈就绪事件。内核通过一个事件表直接管理用户所有感兴趣的事件,所以每次调用无需反复传入用户感兴趣的事件。通过三个参数分别传入可读、可写、异常事件,不绑定 fd 与事件,每次都要重新设置。内核维护事件表,注册一次即可,无需重复传入,
2025-06-20 16:35:40
278
原创 高性能定时器
相比较于基于排序链表的定时器(使用一条链表来管理所有的定时器,插入效率随着链表长度增加而降低),时间轮则使用哈希表的思想,将定时器散列到不同的链表上,每条链表上的定时器个数明显少于原来的排序链表,插入的效率基本不受定时器个数的影响。在时间轮中,指针每次指向轮子上的一个槽(slot,也就是一个链表),他以恒定的速度顺时针转动,每次转动称为一个(tick),一个滴答的时间称为时间轮的。添加一个定时器事件复杂度是O(Logn),删除一个定时器的时间复杂度为O(logn),执行一个定时器的时间复杂度O(1)。
2025-06-14 11:38:51
387
原创 高性能服务器程序框架知识梳理
当前的领导者如果监听到I/O事件,首先从线程池中推选新的领导者,然后自己处理事件。异步线程监听到客户请求后,将其封装插入请求队列,请求队列通知某个工作在同步模式的线程读取并处理该请求对象。要求主线程(I/O处理单元)只负责监听fd上是否有事件发生,有的话立即将事件通知给工作线程(逻辑单元),“异步”只程序的执行由系统事件驱动。综上,连接socket上的事件是由系统调用aio_read/aio_rea注册到内核的,当然了,领导者在监听到事件时指定一个追随者来处理事件,此时领导者不变,继续监听。
2025-06-13 16:37:34
797
原创 二叉树(二)
根据二叉搜索树的特性,最小绝对查一定出现在一颗子树的根和他的左右儿子的差值上,依旧使用中序遍历。一个比较直接的方法就是用map存每一个值出现的频率,然后导出最大频率对应的数值。如果当前值大于上一个节点的值,继续遍历直到遍历完整棵树。如果当前值小于或等于上一个的值,说明不是二叉搜索树。既然是二叉搜索树,还是采用中序遍历来实现对结果处理。530. 二叉搜索树的最小绝对差。501.二叉搜索树中的众数。
2025-06-03 20:02:48
189
原创 二叉树part04(二)
如果使用全局变量sum来计算路径总和并进行比较,那就要考虑回溯问题,如果当前路劲总和不等于目标值,需要计算下一条路径总和时就需要将当前这条的路径和进行清理,所以要回溯。1. 后序遍历数组的最后一位就是该二叉树的根节点,然后根据根节点在中序遍历数组中的位置,划分左子树和右子树,可以得到他们的前序和中序排列。利用递归的特性,反正会遍历完整颗树,每次找到左叶子节点就更新结果,最后一次更 新的就是最深的叶子节点。又忘记用vector构造的时候传入的是数组的下标并且是左闭右开的。513.找树最左下角的值。
2025-05-28 11:41:08
259
原创 二叉树part03(二)
看到本题可能一下想到层序遍历,其实没有那么简单,因为找的是左叶子不是左侧节点, 使用递归的话后序最好。404. 二叉树的左叶子之和。257.二叉树的所有路径。110. 平衡二叉树。
2025-05-27 21:05:43
144
原创 协程库项目-scheduler工作过程梳理(改)
具体流程如下图所示,关于tickle()唤醒操作则是在io+scheduler中实现,目前只要工作线程被创建了就会处于一个忙等待状态,自身的主协程和空闲协程会一直来回切换,直到任务到来执行任务具体工作流程如下图。开始工作,取任务并调度工作线程执行任务,通过互斥锁来实现同步,然后主线程等待所有工作线程执行完毕回收资源join(), 继续执行main(),程序结束。主协程创建线程池,负责执行任务,该方法会根据n创建含有n-1一个工作线程的线程池,因为主线程也参与调度,即也能作为工作协程去工作,所以是n-1。
2025-05-27 13:19:58
338
原创 二叉树part01(二)
前序遍历求深度(自上而下深度递增),如果是根节点的高度(自上而下高度递减),所以本题用前序遍历很方便。主要要确保找到的最小深度是叶子节点的最小深度。今天都是二叉树的基础题。3. 二叉树的最大深度。3. 二叉树的最小深度。
2025-05-26 20:32:50
187
原创 前k个高频元素(二)-优先级队列应用
综上,所述本题应该使用小顶堆,才能每次从队列首部移除较小的元素,一直维护值大的元素(需要说明的是首先被移除的元素优先级更高,优先级队列本质上就是一个堆,但是优先级队列对外表现是从头部移除元素,从尾部加入元素,看起来就是一个队列,堆是一颗完全二叉树,大顶堆就是节点值不小于他的左右孩子,小顶堆就是节点值不大于他的左右孩子。最后收集结果不要忘了小顶堆存的是键值对。
2025-05-24 13:08:58
155
原创 队列part02(二)(滑动窗口最大值)
逆波兰表达式就是便于计算机执行数值运算的方法,属于栈的应用规则就是遇到数字就将数字入栈,遇到运算符就将栈顶元素和第二个元素拿出来运算,将结果再入栈。2. 滑动:先把最早进入窗口的元素移出队列,然后将新元素从队头加入窗口,并且把比他小的元素都pop_front()2. 上一个窗口的最大值不是最早加入的元素,那么在更新上一个窗口的过程中,最早加入的元素已经被自动移除。1. 上一个窗口的最大值是最早加入窗口的,元素下标为i-k,移除他,然后加入新元素下标i,整列队列。3. 收集最大值:队列尾部的元素。
2025-05-23 12:33:36
160
原创 栈与队列part01(二)
1. 遍历字符串遇到左括号就将对应右括号放入栈中,遇到匹配的右括号就将栈顶元素出栈,如果遍历完字符串刚好栈为空,说明是有效字符串。遍历字符串将元素依次入栈,如果当前元素和栈顶元素执行出栈操作,且元素不入栈相当于完成了删除操作,最后栈内的元素就是答案。可以用两个队列实现栈,也可以通过改变队列中元素的排列用一个队列实现栈来提高空间利用,以下是用一个队列实现栈的方法。3. 如果在遍历过程中发现栈是空的,说明前面有单独的右括号,也不是有效字符串。4. 删除字符串中所有相邻重复项。
2025-05-22 12:44:37
226
原创 字符串part02(二)
KMP算法就是为了快速的在文本串中找到给定的模式串。解决逐个问题的暴力解法就是分别遍历文本串和模式串,然后逐个判断字符是否相等,如果相等指针同时向后移动;而KMP算法就是通过计算next数组记录已经匹配的文本内容,当出现字符不匹配时,利用记录的信息避免从头再做匹配。首先要计算next数组,leetcode”28.找出字符串中第一个匹配的下标“可以算是KMP算法的裸题。判断情况1next数组的最后一位肯定不是0且字符串长度是子串长度的整数倍。首先计算模式串needle的next数组,3. KMP算法回顾。
2025-05-21 13:23:30
275
原创 字符串(二)
与三数和解法一脉相承,利用双指针以及修剪,要注意的一点是target可能为负数。整体思路就是:去除多余空格,将字符串整体翻转,然后在将字符翻转。双指针法(移除元素,然后重新设定字符串的大小或者截取字符串)扩充原来字符串的长度,然后利用双指针法重新填充字符串。在第一个break就可以收集结果了。哈希表的遗留题目:四数之和问题。4. 反转字符串里的单词。
2025-05-20 12:57:23
174
原创 代码随想录哈希表part02(二)
用这道题回顾了以下用回溯算法解决组合问题的方法,相当于暴力解法,数组长度到一定程度会超时。四个数组各取一个数字,找出所有和等于零的组合,思路就是转化成两数之和。优化: 使用数组维护哈希表。
2025-05-18 13:44:27
167
原创 代码随想录哈希表part1(二刷)
要求返回和等于目标值的两个数字的下标,用一个数据结构来存元素对应下标,然后遍历数组通过target与当前数组的元素的差值去查哈希表,找到另一个下标,注意不能使用相同下标的元素。要求输出结果中的元素都是唯一的,利用unordered_set中数值不可重复的特性,将交集元素存在该数据结构中,输出时转化成题目要求的数据结构。的特性统计单词1中各字母的出现频率,然后遍历单词2将字母出现的频率进行相应的减少操作,最后检查值是否都为0.主要注意数字的差分,以及如果不是快乐数循环的终止条件。1. 有效字母的异位词。
2025-05-17 16:26:49
229
原创 图论part10 bellman_ford算法
适用队列优化bellman_ford,简单来记就是邻接表存图(维护边),BFS,并使用标记数组对目标节点进行标记,但是需要有取消标记的操作。卡码网94:寻找从节点1到节点n的最短路径并计算路径总权值,输出权值;不存在路径输出unconnected。次得到,同时还能得到到所有节点的最短距离。对状态一二进行选择得过程就叫松弛。(可能是其他边链接的节点。只要知道松弛一次得到的是。到达和起点一条边相连得。的最短距离就能通过松弛。
2025-05-14 11:59:46
468
原创 图论part09dijkstra算法
最小生成树里面含有多个节点,一个非树节点可能和树里面的多个节点都相连,mindist存的是距离最近的那一个,比如树里有五个节点,节点6(非树)与树中的节点4、5都相连,距离分别是3和6,mindist取3;还是要初始化minDist数组用来存距离源点(起点)的最小距离,且初始化int最大值。里面从起点开始数值应该由近到远累加的,所以说该算法可以求起点到所有节点的距离。就是利用小顶堆将第一步优化,在使用邻接表使遍历更高效。算法是存每个未访问节点到起点的最短距离,在。该算法可以同时求到所有节点的最短路径。
2025-05-13 10:29:32
424
原创 图论拓扑排序
更小的内存开销:map需要维持平衡树的结构,unordered_map也要维持哈希桶,相比下vector开销更小。对于图论来说,图谱排序就是将一个有向图转换成线性的排序,其中很重要的一点是判断图中有无环,即存在循环依赖的话就不能做线性排序。拓扑排序(有向无环图):事件之间存在依赖关系,事件A依赖于事件B,那么A的实现的前提是B先实现。拓扑排序就是重复以上过程,如果找不到入度为0的节点说明有环,拓扑算法也是判断有向环的方法。可以用邻接表存有向图,别忘记初始化表的大小,使用邻接表的好处。
2025-05-12 11:06:44
393
1
原创 代码随想论图论part06冗余连接
冗余边就是已经边已经在并查集里了,从图的角度来说构成了环(冗余连接2要用到这个概念)删除入度2的节点其中的一条边判断是否合格,合格情况1输出;不合格,删零一条边,情况2。代码其他部分为:并查集初始化,查根,判断是否在集合里,加入集合。查找的是目标节点,不要写成edges[i][0],否则会漏边。分三种情况,分部处理,最简单的就是只构成环,下面从后向前遍历存的边i初值不能设为n-1。n的数值已经由while(n--)改变了。其次统计的是入度为2的节点对应的边。
2025-05-09 23:01:25
700
原创 代买随想录图论part05并查集基础
可以理解为,图中有一个个节点,通过已知边的关系,将这些节点连接起来,并用集合存储这些关系,连接的原则是只有源和目的,两点之间不存在中间节点。当新的节点要加入并查集,可以通过find在并查集里搜索其根。通过join更新并查集建立节点之间的关系。初始状态:每一个节点的根都是其自身。
2025-05-08 12:46:26
156
原创 代码随想录图论part4
排除以上两种情况,说明替换后的字符串是合法字符串但是还没到达终点。没有抵达终点就判断是否是已经是标记过的字符串或者是非法字符串。具体是通过对栈顶字符串的每个字符用26个字母逐个替换。测试案列默认有输入边数k,这样写就导致边混乱,原本。通过逐个修改字符完成从一点到另一点的变换。该题本质是最短路径问题,方法:广搜。照我上面写 s t 导致结果会出错。入栈并且进行标记,路径长度+1。每次替换要判断是否抵达终点。
2025-05-07 13:28:18
541
原创 代码随想录图论part03
2.需要一个哈希来记录添加的新陆地周边(上右下左)已经计算过的岛屿编号,防止重复计算(例如,新陆地的左边和下边是同一片岛屿,这时候就得跳过左边),每次遇到新陆地就要清空该表,动态变化。逆向思考,找两个边界的公共源头,从第一边界出发找到所有源头,再从第二边界出发找到所有源头,重叠处即为目标。思路:首先找到目前最大面积的岛屿,然后遍历岛屿周边的海洋,然后找到以某一片海洋为中心的岛屿面积的最大值。1.遍历岛屿周边海洋,岛屿已经有编号,获得周围连接岛屿总面积,根据编号查表。孤岛问题:先处理边缘岛在处理孤岛。
2025-05-06 14:09:28
570
原创 代码随想录图论基础(所有可达路径)
看完理论自己尝试了一下,今天采用DFS并且使用邻接矩阵存图,明天学习使用邻接表。修改处理逻辑,有效路径的目标节点依旧为传递参数,然后每一层寻找该节点的目标。比如4->3 , 3会通过嵌套循环回到2,然后这样往复。出现了无限套娃的情况。
2025-05-04 00:13:49
214
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人