- 博客(72)
- 收藏
- 关注

原创 [数据结构]并查集(系统整理版)
每次合并把元素少的连通块合并到元素多的去。维护一个size数组s 初始化为1。最后cnt即为最后的连通块个数。这样合并能时树的高度增长相对少。减少路径压缩次数 提高查询效率。初始化cnt为元素个数n。因为并查集类似树形结构。每次合并时 cnt–
2025-03-29 10:24:51
664
原创 [二叉树]关于前序、中序、后序、层序序列
从上到下、从左到右依次填满只有最后一层可以不满,但必须从左往右连续填充举例:A/ \B C/ \ /D E F提供的遍历是否能唯一建树?说明中序 + 前序✅ 能最常见、能唯一建树中序 + 后序✅ 能也可以唯一建树前序 + 后序❌ 一般不行除非是满二叉树才行只有一种遍历❌ 不能信息不够,多种可能的树必须有一个中序序列 才能唯一确定一颗二叉树。
2025-04-22 16:15:42
308
原创 [数据结构]Trie字典树
"apple", "app", "april" ==> 共享前缀 "ap"↓Trie 就是把这些前缀共享,像搭积木一样拼起来↓节省空间 + 查询高效。
2025-04-10 19:34:07
412
原创 [leetcode]494. 目标和(01 背包dp)
个数的非负数组,每个数都要选,可以选这个数的相反数或者自己,求有多少种方案使得和为。为数组中选负数的和的绝对值,则有。个元素中找出一些数 和为。为数组中选正数的和,
2025-04-07 15:26:34
751
原创 [leetcode]416. 分割等和子集(01 背包dp)
请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。转化成找出数组中一部分数相加等于数组总和的一半。给你一个 只包含正整数 的 非空 数组。
2025-04-07 15:11:17
214
原创 [leetcode]2662. 前往目标的最小代价(二维坐标建图)
建图只需要建起点终点和特殊路径的点和边 因为走其他的点一定不是最优的 从。任意两点间的距离是曼哈顿距离(无向边)另外给出特殊路径(有向边)点 所走的曼哈顿距离是跟从。
2025-04-06 10:23:46
552
原创 [leetcode]3123. 最短路径中的边(Dijkstra+反向搜索找边)
【代码】[leetcode]3123. 最短路径中的边(Dijkstra+反向搜索找边)
2025-04-05 19:37:45
542
原创 [leetcode]1786. 从第一个节点出发到最后一个节点的受限路径数(Dijkstra+记忆化搜索/dp)
思路同上,把记忆化搜索改成dp,我感觉没有记忆化搜索直观,但是能快一点点。通过dfs枚举每种方案 加上记忆化 避免超时。根据最短路从小到大更新dp。之间有一条无向边,边权为。定义受限路径: 从起点。给定一个无向连通图,
2025-04-05 17:12:23
1167
原创 [leetcode]1462. 课程表 IV
如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的决条件。q次询问 给出一个queries数组 返回每个询问是true/false 以数组形式返回。给定n个课程 ,一个二维数组。这样查询的时候只需要。
2025-04-01 20:41:35
295
原创 [leetcode]2685. 统计完全连通分量的数量
完全连通分量:就是一个连通块中 ,所有点之间都两两有边相连。一个完全联通分量有n个点 那么应该有。连通分量就是一个连通块的意思。给定无向图,求完全连通分量。检查每个联通分量是否有。
2025-03-31 17:15:52
256
原创 [leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)
如果1和n联通 并且这条边在1和n的这个连通块中。遍历每条边 每次合并边的起点和终点。求1-n的路径中最小的边权是多少。
2025-03-31 14:34:39
280
原创 如何在set和priorty_queue中自定义排序方式
首先 默认为大根堆 top为最大的元素结构体当然要自定义排序方式 上面的就是实现默认大根堆顺序 把score最大的放在top看小于号方向就行了 都是重载的小于号 只要return里的不等号也是小于号 那么就是默认大根堆顺序如果要改成小根堆 就把不等号改成大于号就行。
2025-03-30 20:08:54
481
原创 [leetcode]547. 省份数量
这是图论非常入门的题了吧 不过我才刚会做哈哈哈。其实非常简单 接下来要开始系统地学图论和dp了。就是遍历每个点 如果没有被标记过 就cnt++并且对他搜索 把所有跟他联通的点都标记上。给定一个邻接矩阵 求有几个连通块。其实很简单 不过我做这题时才知道。就是把cnt初始化成元素个数。这个题意很显然可以并查集做。每次合并时cnt–就行了。
2025-03-29 08:21:18
348
原创 [leetcode]1749. 任意子数组和的绝对值的最大值(dp)
前缀和 遍历尝试以[1,n-1]每个元素作为子数组结尾的情况 对n个sum取max。这样[j+1,i]的子段和就是[0,i]中所有子数组和最大或者最小的。这里使用set维护前面的子段和 也可以开一个大根堆和一个小根堆。对于每个点作为结尾 考虑前面的子段和[0,j]最小或者最大。dpmx[i]表示以nums[i]结尾的子段中最大子段和。dpmn[i]表示以nums[i]结尾的子段中最小子段和。求任意一个子数组和的绝对值的最大值(子数组可以为空)对于最大子段和、最小子段和分别动态规划。最后对abs取max。
2025-03-28 19:35:41
485
原创 [leetcode]打家劫舍I+II(dp)
比上题多了个限制条件 就是0号位置和n-1号位置也视为相邻。dp[i]表示下标[0,i]这些能选的最大数字。一个数组 不能选相邻数字 求能选到的最大总和。nums[0]要么选 要么不选。
2025-03-27 11:14:14
285
原创 [leetcode]2258. 逃离火灾(多源BFS+贡献法+二分答案)
给定n×m的地图0 表示草地。1 表示着火的格子2 表示一座墙火每分钟会按照四联通蔓延到草地上人每分钟可以走一步 从左上角出发 到右下角每分钟是人先走 火再蔓延 但是人不能走到某个格子上 同一分钟火就烧到这个点上来了。
2025-03-25 10:02:55
646
原创 [leetcode]1263. 推箱子(A*+优先队列BFS+DFS)
这题有一个要特别注意的点 箱子也占一格 可能会把人挡住 所以不能一开始就用并查集预处理空白点的联通性 要动态判断两点间的联通性。不是人走的步数 人可以走任意步数 每次推箱子 要走到箱子移动方向的另一头 如果此时没有路能到这个点 就不能推。'S’是玩家初始位置 'B’是箱子初始位置 'T’是箱子目标位置。比如有时候人在箱子右边 上下都是墙 人就会被箱子挡住。箱子在同一个点 人在箱子左边 这时候就不会被挡住了。因为箱子在同一个点 而人在不同的点的状态是不同的。其实这题的数据范围应该不压缩也一样能开得下。
2025-03-22 15:13:30
1095
原创 [洛谷](记忆化搜索&int类型dfs)P1434 [SHOI2002] 滑雪
不需要vis数组 因为保证只能从高往低走 不会出现往回走的情况。数据不大 可以枚举每一个点作为起点dfs 对ans取max。的地图 每个点是一座山的高度 只能从高向低滑。从任意点开始 求最长路径。
2025-03-22 09:00:00
282
原创 [leetcode]864. 获取所有钥匙的最短路径(状态压缩bitmask+bfs)
说回bitmask 二进制上每一位代表这一位所对应的钥匙是否获得 通过c-'a’进行映射。在二进制意义上看 最多6个钥匙 也就是最多。保存这个状态的坐标 走的步数 当前钥匙状态。目的是收集所有钥匙 不一定要把门都打开。‘.’ 代表一个空房间。
2025-03-21 14:43:12
496
原创 [leetcode]1631. 最小体力消耗路径(bool类型dfs+二分答案/记忆化剪枝/并查集Kruskal思想)
只需要维护每个点的联通关系即可 只要起点和终点联通 就代表一条完整的路径出现了 这个思路太妙了 实现起来很快。对路径体力值二分 每次check就是dfs一下能不能在这个高度绝对差不超过mid 的情况下走到终点。用并查集维护 一旦起点和终点在一个联通块内 就返回此时的边权(因为排序过了 一定是最大的边权)定义高度绝对差为四联通意义下相邻的两个点高度的绝对值之差。定义路径的体力值为整条路径上 所有高度绝对差的max。地图 要从(1,1) 走到 (n,m)求所有路径中 最小的路径体力值是多少。
2025-03-19 16:47:16
999
原创 CF1059B Forgery
给定一个n,m的目标矩阵初始矩阵全为′′你可以染色无数次,每次选定一个格子将它周围的八个格子(除它自己)的3*3矩阵覆盖成’#'。这个3*3的矩阵只能出现在n∗m的矩阵内部。不能越界。询问是否能构成目标矩阵。
2025-03-12 16:43:01
425
原创 [2025zjgsu校赛]G 演唱会
n×m的地图x是墙是空白位置1是人p是敌方乐队位置挑一个点 空白或者是行人所在位置开演唱会 每个行人会根据我们乐队和敌方乐队哪个距离近 就去听哪个演唱会 如果最短距离一样 就来听我们的求我们最多能获得多少观众。
2025-03-09 15:09:27
796
原创 [2025zjgsu校赛]E 异或大王
意思就是两个数组 以a数组为主 把所有a数组的异或和找出来 每个异或和可以异或上对应的b[i]也可以不异或找到第k大的异或和。
2025-03-09 14:35:46
241
原创 [蓝桥杯]路径之谜
从左上角走到右下角 四联通方向 每走到一个格子 向正北和正西射一支箭 每个点只能走一次。idx表示上一次是第几步 (从0开始) 用于path数组记录 填充和撤销。因为x,y代表上一次走的点 既然上一次已经走到右下角了 就不要继续往下走了。x,y 表示上一个点的坐标 这一次dfs要通过(x,y)的四个方向扩展。另外 要判断每个行列的箭数目是否匹配 如果匹配才要输出path。这段代码注意要在x==-1&&y==n-1 时return。题目给出最后竖向和横向上的每个靶子上的箭的总数。
2025-03-08 10:26:05
1106
原创 [蓝桥杯]数字三角形(记忆化剪枝/DP)
①n为奇数 n-1为偶数 向下和向右各走(n-1)/2步 所以最终答案落在dp[n][(n-1)/2+1]所以最终答案对dp[n][(n-1)/2+1]和dp[n][(n-1)/2+2]取max即可。比最普通的数字三角形题目多加了一个限制 就是竖直向下的步数和向右下的步数之差<=1。②n为偶数 n-1为奇数 向右走(n-1)/2或者(n-1)/2+1步。这里必须对n分类讨论 如果n为奇数 但是还用②取max的方法会wa。在列方向上 只有向右下走的步数会对最终答案所在的列产生影响。
2025-03-07 22:48:33
469
原创 [蓝桥杯]岛屿个数
地图外的都是外海 可能会跟地图内的内海联通 那么把这些联通的内海都标记为外海。如果一个岛被另一个岛环住 就不统计入内 这个意思 看样例图比较好理解。if判断条件中要加上st[i][j]==0 不然会重复计算很多个岛屿。在if里面要记得把st[i][j]标记为1 不然这个起点会被重复走。给定一个n*m的地图 0是水 1是陆地 统计一共有多少个岛。我一开始把八联通的方向数组写错了 写成了。这两个我一开始都忘记了 导致我调了好久。实际上应该两个0 三个1和-1。只有与外海相连的岛屿才需要统计。
2025-03-07 19:26:27
449
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人