- 博客(23)
- 收藏
- 关注
原创 二分图题目
1. 遍历所有节点,把当前节点的临边节点放在一个集合里,因为当前节点一定要与临边节点在不同集合,也就是临边节点在同一个集合。如果边的两端节点已经属于同一个集合,就不是二分图。因为二分图的定义就是边的两端属于不同集合。2. 最后再检查一遍,当前节点 有没有和临边节点在同一个集合。如果访问过且颜色和源节点一样,就不是二分图。深度优先遍历,记录访问过的节点和颜色,遍历图节点。如果没访问过,就赋予不同的颜色。二分图:指每条边都连接着两个不同区域。边两端的节点不同颜色,只有两个颜色。遍历完没有冲突就是二分图。
2024-08-04 18:41:52
223
原创 二叉树前中后序遍历相关
前序的第一个节点代表了根,找到其在中序中的位置index,index左边就是其左子树,右边位右子树。且可以得到左右子树的大小,再从前序数组中取出右子树,再次递归这个过程。前序的第二个节点是左子树的根,在后序数组中找到左子树的根的位置就能知道左子树的大小,也就知道右子树的大小。此外,可以先创建一个hash表,使得可以快速找到根节点在中序数组的位置,优化。边界条件为无元素,返回null即可。求后序数组的话,则无需创建节点。需要记录两个数组的左右边界!前序是中左右,后续是左右中。
2024-07-27 17:34:35
243
原创 设计类的题目
hash2: 存一个频率内的所有节点,即{频率,双向链表},每次从最小频率的尾节点删除,添加到指定链表的头节点。hash是用来存key和对应的缓存结构体,可直接操作set里的,从而在每次操作时修改时间以及频率。set是有序的,存以频率和时间排序后的缓存结构体:频率小的在前,相同频率时间小的在前。hash1:维护val -> freq,以便能插入对应的freq栈。hash2:每一个freq用一个stack存同频val的进入顺序。设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出。
2024-07-24 00:46:09
472
原创 LC 4寻找两个正序数组的中位数
找第mid小的数,先判断两个数组mid/2位置的数,小的那个数组之前的i个数都可以排除掉,然后再继续找第(mid-i)小的数,重复。如果一个数组被排除完了,那就直接找剩下数组的第mid个数。如果mid = 1,取未排除中小的那个数。请你找出并返回这两个正序数组的。的正序(从小到大)数组。
2024-07-21 15:12:47
280
原创 回文串系列
dp[i][j]表示[i:j]的子串是否是回文串,只有当s[i]=s[j],dp[i][j] = dp[i+1][j-1];dp[i][j]表示[i:j]的最长回文子序列,当然也是考虑了删除字符的情况。如果只能删一个字符怎么办?那就循环剔除再找最长不删除的回文子串就行。题目说可以删除多个字符!而不是单单求出所有回文子串就行。枚举回文串中心,然后向两边扩展。注意中心可能是两个字符。也可以外层正序遍历长度,内层遍历起始点。
2024-07-07 17:54:04
212
原创 LC410分割数组的最大值
推导:只考虑最后一次划分的位置,假设在k处划分,所求值是dp[k][j-1]和subsum[k+1:i]间的最大值,对于每一个k都需要计算,求得最小的结果。dp[i][j]表示将[0:i]字符串分割成[j]份的 所求值,最终求的是dp[size][m]求二分值所需的最小份数,用贪心思想,只要没超过目标值就计入。给定一个数组,要分割成m份,使得最大的(份和) 是最小的。目标值的区间是 max(最大值,平均分)到总和。用二分的方法求得能够满足份数的最小目标值。(TP提前批2面遇到的,没做出来。
2024-06-28 18:13:43
356
原创 LC2928给小朋友们分糖果
只有3个小朋友,限制每个小朋友分到不超过limit个糖果,总共有n个糖,分完的方法有几种?插入两个隔板,将n分为三块,每块大小不超过limit,的分法有几种。第一个人分x,还剩n-x。
2024-06-03 15:45:32
343
原创 LC2981/2 找出出现至少三次的最长特殊字符串
问题等价于:对每个字符进行计算,求得至少出现三次的单字符串的最大长度。解题思路:对于每个字符,首先遍历,收集连续出现的字符的长度集合。
2024-05-30 19:44:19
189
原创 LC2333最小平方和
遍历到a[i]时,a[0]到a[i]的平方和都已经减去,且值都认为减到相等了。d = a[i] - a[i+1], 下一次要将a[0]到a[i]的值都减到a[i+1],如果可以,把操作次数k减去(个数*d);如果不可以说明已经到达极限,需要往回加上a[0]到a[i]的值,其中有每个数都可以减去(k/个数),还有(k%个数)可以多减1,加回他们的平方值就是结果。为了不需要每次重新操作,用动态规划思想,只用一次遍历完成核心计算。问题等价于:给定一个正整数数组,以及可以操作的次数k,每次操作-1。
2024-05-29 17:16:06
192
原创 LC2332坐上公交车的最晚时间
题目:给公交车发车时间表buses,以及乘客到达站点时间passengers。buses不同时,乘客也不同时。以及bus容量capacity。求你的最晚上车时间(不能和乘客同时)。尽量做最晚那班车,不用排队就最后上车。要排队就找到最晚上车的人,在他前面插队。
2024-04-04 22:12:51
315
1
原创 LC849到最近人的最大距离
题目:给一个数组,1表示有人,0没人。求当前要坐下一个人,里附近人的最大距离。1.只有右边有人:只需要记录最左边的人的位置,他应该坐在最左边。3.两边都有人:记录左右两边人的位置,坐中间(d/2向下取整)。思路:有三种情况:只有右边有人,只有左边有人,左右都有人。2.只有左边有人:需要记录最右边的人的位置,他坐在最右边。一次遍历得到结果,max可以用{}比较多个元素。
2024-04-04 13:44:32
184
1
原创 二叉树的最近公共祖先
题目:LCA(lowest common ancestor),给树和两节点,求这两节点的LCA。2.返回值:分别在左右返回根,都没有返回NULL,有一个返回那个。3.边界条件:访问到null 或访问到目标点,直接返回。1.拆分问题:在左右子树上找这两个点。
2024-04-03 23:33:51
192
1
原创 并查集学习笔记
处理不相交集合的合并问题,:求连通子图,最小生成树(Kruskal),最近公共祖先(LCA), LC2421、LC2382初始化:一维数组存父节点(代表元),初始为自己。fa[N]查询:递归不断网上查找祖先合并:合并两个元素,找到这两个元素的祖先,改变祖先合并成一连。
2024-04-03 22:42:47
376
1
原创 LC2381字母移位II
第一次知道可以用差分数组去处理这类问题:需要多次进行区间操作,不需要每次执行操作,记录在差分数组里,处理结果时求得差分数组的积分去处理。例如:s = "abc", shifts = [[0,1,0],[1,2,1],[0,2,1]],输出"ace"题目:给一个字符串,以及多组区间操作(start,end,操作+1-1),求最后结果。首先,将下标从 0 到 1 的字母向前移位,得到 s = "zac"。然后,将下标从 1 到 2 的字母向后移位,得到 s = "zbd"。
2024-04-03 14:30:43
197
1
原创 LC2380二进制字符串重新安排顺序需要的时间
思路:1往前挪的最少次数是前面0的个数,还需考虑如果两个1连续时,后面的1无法移动,导致所需秒数+1。动态规划一次遍历求解。s[i] 为1且前面有0,dp[i] = max(pre0, dp[i-1] + 1)1. dp[i] 表示 s[0:i]完成目标所需的最少秒数,pre0是遍历到当前出现0的个数。s[i] 为 0,dp[i] = dp[i-1]求完成这个过程所需要的秒数。这个过程持续进行到没有。题目:一个二进制字符串。
2024-04-03 14:08:18
213
1
原创 最短路径问题Dijkstra&Floyd
过程:取出dist中没有被path标记的最短距离的节点(可以用优先级队列),添加该点的所有边,更新dist数组,循环往复,直到所有点都被标记(即循环N次)。邻接表:节点数为N,构造长度N的一维向量,每个数组元素存放一个链表(或pair<int,int>向量),串联所有与该节点相连的边的指向以及权重。具体:把起点放入队列,然后步数+1,向队列中加入当前步数可以访问到的节点,循环往复直到队列为空。邻接矩阵:节点数为N,构造N*N的二维矩阵,表示节点到节点间的距离。过程:外循环遍历中间点,内两层循环遍历所有点。
2024-04-01 13:57:58
239
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人