- 博客(19)
- 收藏
- 关注
原创 AcWing之第154场周赛
仔细阅读此题我们可以发现,无论是切割X轴或者Y轴,它们是互不干扰的,也就是说我们只需找出每次切割后X轴区间的最大值和Y轴区间的最大值即可,我们可以使用map来存以及更新区间最大值。阅读此题,细细思考,我们可以发现要想满足题目中的条件,那么每个子连通图都必须是完全图,那么每个点的度就等于这个连通块点的数量减一,可以使用并查集来维护连通块点的数量。
2024-05-05 01:09:55
365
原创 LeetCode之第395场周赛
在 0 ~ n 中二分 k,若 k 得出的可选子数组数量覆盖了中位数下标,那么 k 就是答案,具体去求可选子数组数量,可以用滑动窗口来求。此题涉及到位运算,需要按位分解,若要让所有元素按位与结果为x,那么如果x此位为1,那么所有元素此位都必须为1,而其他位则随便。由于最多移除两个整数,所以枚举每一种情况。
2024-04-30 18:25:53
313
原创 AcWing第153场周赛
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。所以我们解决这道题的的基本思想就是,找到其中一些数,使其gcd等于1,然后找最小值可以用01背包来解决。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.贪心对左端点进行排序,然后遍历分组即可。
2024-04-28 11:19:59
499
1
原创 LeetCode之二叉搜索树最近节点查询
由于题目上没说二叉搜索树是平衡的,故如果在最坏情况下,二叉搜索树是一条链的情况下,这时针对每条询问都从上向下遍历的话,时间复杂度会达到O(n^2),会超时。所以我们不如先中序遍历,将树从小到大存起来,然后再针对询问进行二分搜索,最后时间复杂度是O(nlogn)。
2024-04-26 17:13:46
253
3
原创 LeetCode之感染二叉树需要的总时间
读完题目我们可以发现,题目所求解的其实就是从开始点到图中任意点的最大距离,但题目中所给出的二叉树是一个有向图,不支持访问其父节点,所以我们可以先从根节点深度遍历建立无向图,然后可以再次深搜或者也可以广搜,边搜边记录更新当前点到开始点的最大距离,这个最大距离就是感染二叉树的最大时间。
2024-04-25 18:21:58
376
4
原创 最近公共祖先(LCA)详解
1.前言公共祖先问题是指在一个树结构中,找到两个节点的最近公共祖先(Lowest Common Ancestor, LCA)。公共祖先指的是两个节点的某个祖先节点,而最近公共祖先则指的是离这两个节点最近的共同的祖先节点
2024-04-24 22:20:45
879
原创 LeetCode之第394场周赛
先使用Dijstra算法求解起点每一个点的最短距离,然后从终点反向DFS遍历寻找该边是否在最短路径上。Hash表存储是否出现大小写字母的状态,然后枚举即可。使用Hash表存储四个状态,注意状态转移,一遍过即可。
2024-04-22 12:17:33
431
原创 树状数组详解
1.前言正式开始讲解树状数组之前,我们先来思考一个问题,假如给你一个数组a[N],要你完成w次修改和q次查询区间和,这时你该怎么办?如果说直接使用前缀和的话,那么查询操作时间复杂度为O(1),但是修改操作将变为O(n);但是如果不使用前缀和的话,那么查询操作将变为O(n),修改操作将变为O(1)。那有没有一种方法能够将这两种操作兼顾呢,是有的。下面要讲解的树状数组就将这两种操作兼顾了,时间复杂度均为log(n),近乎完美的解决了上述问题。
2024-04-21 12:32:27
1797
1
原创 位运算之异或和之和
1. 异或运算满足交换律和结合律:a^b^c = a^c^b2. 任何数和0进行异或运算,结果还是这个数本身:a^0 = a3. 任何数和自身进行异或运算,结果是0:a^a = 04. 异或运算是可逆的,即对一个数进行两次异或同一个数,结果还是这个数本身:a^b^b = a。
2024-04-20 21:06:40
296
原创 LeetCode之最长有效括号
对于本题,我们可以采用动态规划的思路来解决本题。读懂题意细细思考的话,我们可以发现,只有这个子串以右括号结尾,它才可以称得上有效括号子串,所以我们只需要看右括号就行了。(2)如果s[i-1]是右括号的话,也就是像 ·····)),那么状态是由f[i-1]和f[i-f[i-1]-2]的和再加2转移而来。(1)如果s[i-1]是左括号的话,也就像这样 ·····(),那么毫无疑问状态转移方程一定是。
2024-04-19 00:59:12
396
原创 LeetCode之接雨水
双指针的具体思路是使用两根指针分别指向序列头和序列尾,由于接到雨水的量是由一个坑洼处最低的边界决定的,所以我们要让两头指针中最低的那一端向内移动去寻找更高点(不然接雨水的量永远都被最低端限制,无法增加),倘若左指针小于右指针,我们首先要找到左边的最大值,否则不能接到雨水,然后我们往下面逐步遍历低洼处,逐步计算面积,右指针大于左指针时情况也是相同的。
2024-04-17 20:58:42
348
原创 LeetCode之使括号有效的最少添加
此时如果我们试着从前往后遍历字符串的话,我们就可以发现如果说此时左括号‘(’数量多于右括号的话,我们可以在任意一个(不超过序列第一次左括号多于右括号)位置插入右括号,此时都可以使字符串变成有效字符串。但是如果右括号比左括号数量多,我们就不能在右括号后面位置插入左括号,所以每次遇到右括号比左括号多的时候,就必须在右括号前面插入左括号以变成有效字符串。我们首先细细研读题意,发现只有三种情况A是有效字符串。无论在哪两个位置插入右括号,都能使字符串有效。必须在右括号前面插入左括号以变成有效字符串。
2024-04-16 00:04:43
400
原创 位运算之龟速乘
我们可以把 b写成二进制形式,然后如果某位上为1就加上它a*(2^n)次方(n与这位的位置有关)并且每次计算后取模就可以保证不超出long long的范围。初次看到这道题目,我们可能直接就用高精度来写了,但是这一题也可以使用快速幂的思想来写,第一行输入整数a,第二行输入整数b,第三行输入整数p。求 a 乘 b对 p 取模的值。不懂快速幂的下面附上快速幂的模版。
2024-04-15 16:22:58
235
1
原创 KMP算法详解
KMP算法又称为模式匹配算法,主要是来求一个长的字符串中是否存在相对应的子串。KMP算法可谓是数据结构串中最难的部分了,我也是花费好长时间翻看大量资料才终于理解,最后写下这篇博客,欢迎大家批评指正,最后奉上完整代码,供大家参考学习。int ne[N];void Next(string &s) //下面的ne[]即是next数组ne[0]=-1;//next数组第一个位置不能匹配时无法回溯,故肯定是-1i
2024-03-25 00:14:13
1596
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人