- 博客(145)
- 资源 (1)
- 收藏
- 关注
原创 Leetcode百题斩-二分搜索
二分搜索也是一个很有趣的专题,被做过的题中,刚好一个Easy,一个Medium和一个Hard,刚好可以看看,二分搜索的三个难度等级都是啥样的。
2025-07-12 23:37:15
1020
原创 Codeforces Round 1035 (Div. 2)
连续两场的下一场,是cf的div2,好久没做div2了,最近做div3做的生无可恋,感觉是不是刷水题刷多了刷的麻木了,做做div2试试,结果发现更加惨不忍睹。从上一场的卡题,到这一场又卡题。卡了签到题,最后一题还在调试没调出来,可怜的只做了一道题,太惨了属实。这次我们来倒着看,先写完未做完的C题,最后看卡题的A题思路:给定左右边界l和r,要求找出n个数,使得这n个数的与操作和异或操作结果相同。
2025-07-06 22:21:31
660
原创 Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
这也是水题,用两个数组分别记录队列重复的数量和重复值,出队的时候修改每一位的剩余值并求和就可以了,细节点注意一下变量值的维护,避免死循环,真的离谱,还能犯这种错。从小到大,每次对比相邻两个串进行合并,判断最小值在哪个串内,若在前串则不用动,若在后串,则分别将两串翻转后,合并,再将合并后的串翻转。这题我的思路就是先按照绝对值排序,排完后,求相邻两数的公比,并判别符号,最后特殊注意一下,所有数绝对值都一样的场景,要求要么符号都一样,要么不同符号差最大为1。段,每段内可以进行翻转,求翻转后的最小串。
2025-07-06 21:39:33
951
原创 Codeforces Round 1034 (Div. 3)
首先第一位一定是1,因为在不删的情况下,MEX一定是确定的,然后从后往前MEX个数也一定是按照1~MEX单调递增,原因就是让这些数不重复从0开始依次排列就是能找到的最大情况。我原来的思路是,统计每个数字出现的个数,当删除的数量大于等于该数的出现的次数时,表示这个数能完全被删除导致MEX变化,于是结果加1。方案大思路就是交换因子相同的数。但如果串长达到了2k甚至更长,那么串就能被分为两个甚至以上长度为k的区域,后手就可以每次留一个还包含1的区域不动,将任意一个完整的k区域涂满,就可以保证先手一定无法完成。
2025-07-04 00:29:12
781
原创 Leetcode百题斩-双指针
经典Leetcode接雨水问题来啦,这个问题被归到了双指针专题里,更神奇的是我居然之前接过雨水,我甚至没有任何印象了。巧合的是,接雨水是这个专题唯一一个Hard,来看一看吧。
2025-06-29 16:32:06
649
原创 Leetcode百题斩-贪心
贪心也是一个很有意思的专题,能遇到很多神奇的思路。但这个专题,leetcode也没放Hard,果然是怕这种玄学专题上点难度大家罩不住。那就很快了,直接过。
2025-06-27 15:22:53
364
原创 Leetcode百题斩-DP
又到了最好玩的dp了,各种玄学转移也算是其乐无穷。前段时间刚做的LCA正是这种题的小试牛刀,如果当时就把这个专题刷完了,或许我现在已经从西溪园区跑到云谷园区了。不过,恐怖如斯的dp专题居然只给了一道hard,基本也没啥难度可言了。看部分题目之前也刷过,但也没怎么记录在博客里,这次统一再刷一遍,快速过掉。部分题深挖一下倒也可以温习一些旁路的知识点。
2025-06-26 20:07:05
891
原创 Codeforces Round 1032 (Div. 3)
针对两个数,可以进行按位判断,如果两个数某位相同,则任意一个数一定的该位和两个数一定均相同,即当前位必定带来两个相同位。如果两个数仅相差了1,则至少与其中一个数相同,即必定贡献一个相同位,除此之外,别的情况并不会额外带来相同位数。这题看起来很麻烦,其实也很简单,因为中间的串完全可以只有一个字母,这题瞬间就降级成,求除两头外,字母串中是否有重复的字母。首先的思路就是寻找十字型区域的中心,统计x,y坐标,若x坐标重复出现,则x坐标即为十字型区域的x坐标,同理若y坐标重复出现,则y坐标即为十字型区域的y坐标。
2025-06-19 23:37:52
817
原创 Leetcode百题斩-链表
这个专题算是经典中的经典了,从之前的刷题记录就可以看出,一共14题,其中5题之前都刷过。还是本着时间有限的原则,刷过的题看一下之前的记录就自己思考了,专注冲新题首先,和二叉树一样,先构造一个链表节点的数据结构。
2025-06-17 11:45:49
885
原创 AtCoder Beginner Contest 409
第二发针对在数组中的场景,发现a[i]=i+1的边界条件未被考虑,第三发针对找不到的场景,应该直接将结果设置为数组大小,特别是第三发wa,我深知考虑到了这种case,但却莫名其妙的想当然认为0就是这种case的正确结果,也是不理解脑子一团混乱。这题其实脑子也糊了一下,一开始只记录每个点位的位置,但没统计每个位置的数量,导致怎么都出不来结果,果然还是受第二题卡顿的影响了。思路:旋转字符串,寻找字符串的一个子串,将其整体想坐旋转一位,求一个最佳旋转方案,使得旋转后的字典序最小。最后手动模拟一下字符串旋转即可。
2025-06-12 11:11:34
444
原创 AtCoder Beginner Contest 408
重新整理,其实有分全0(0),先0后1(01),先1后0(10),全1(1)和先0后1最后0(010)这五种方案。由于向后递归,因此过程中其实我们不用关注前缀0的数量,于是,全1和先0后1可以合并为包含部分0且1结尾([0]1),先1后0和先0后1最后0可合并为包含部分0后特定1加特定0([0]10)。首先想到dp,按位dp,分全0,先0后1,先1后0和全1四种状态进行转移。之后又想到先将字符串变为全0或者全1,然后从边开始加数,但此时重新审题突然发现,其实先0后1最后0这种方案也是满足条件的。
2025-06-10 18:25:10
953
原创 Codeforces Round 1029 (Div. 3)
常规操作就是将某个数组中的第i位设置为第二个数组中的第i+1位,该操作可以进行无数次。这就是一个贪心的策略,从后往前遍历,每一轮要求遍历所有现有的元素,即为完整的一个集合。思路:有n个门,部分门开部分门关,每经过一个门耗时一秒,现在有个按钮可以让所有门关的门打开k秒,问人能否顺利通过。方案1:如果某个数组中连续两个数相同,则另一个数组中前一个位置一定也能变成这个数,即前方的位置即可以为答案。方案2:如果数组中某个位置k,其数在任意数组的第k+1位(不包含)之后出现过,则位置k也可以为答案。
2025-06-10 01:47:06
287
原创 Codeforces Round 1027 (Div. 3)
此外,因为每次移动串至少影响两个对称位置数,所以该数量的奇偶性一定保持一致,因此判断一下上下界再判断一下奇偶即可。最近小红书的面试,做到算法题感觉明显自信了很多,自信还是能带来一点加成的,最后面试官直接不让我手撕代码了,直接说你肯定会下个环节吧哈哈。思路:每个节点本身有一个防御值,其通向根节点的路径上每个路径有一个防御值(等于当前节点防御值依次加/减下一个节点的防御值,没经过一个节点变换一次加减符号)。求每个节点的最大防御值,那么其实只要从根节点开始递归维护每个节点的最大和最小防御值即可。
2025-05-28 00:22:51
468
原创 AtCoder Beginner Contest 407
思路:给定一个数组,要求用括号串覆盖数组,最终将所有左括号覆盖除累加求最大值。其实说白了,引入括号串就是为了利用栈的性质,即要保证每一位顺序做选择时,累加的数一定要比丢弃的数多。看这么小的数据量,直接枚举判断即可,最后要注意一下,由于概率判定精确到了小数点后九位,所以一定要拉长最终输出的位数。终于涨分了,这算是这段时间来第一次涨分,之前一直都再降,看来终于算是找回了一点点当年的感觉了。,就是前面的数尽可能累加,后面的数全都丢失。最近的正整数,由于是正整数,就简单了直接求两边的数对比一下即可。
2025-05-26 11:31:09
528
原创 Leetcode百题斩-二叉树
二叉树作为经典面试系列,那么当然要来看看。总计14道题,包含大量的简单题,说明这确实是个比较基础的专题。快速过快速过。先构造一个二叉树数据结构。
2025-05-26 00:26:50
917
原创 Leetcode百题斩-回溯
回溯是一个特别经典的问题,也被排在了百题斩的第一部分,那么我们接下来来过一下这个系列。这个系列一共八道题,偶然间发现我两年前还刷到这个系列的题,回忆起来当时刚经历淘系大变动与jf出走海外事件,大量同事离职闹得人心慌心慌,可能是当时也心生担忧于是未雨绸缪了一下。不知不觉已经过了三年安稳的日子了,生于忧患死于安乐,该努力起来了时间有点久远,记忆逐渐忘却了,之前用c++去攻取,那么这次用java重写一轮看看感觉如何。
2025-05-22 02:01:33
917
原创 Leetcode百题斩-字典树
字典树又名前缀树,顾名思义就是维护字符串的前缀。这个数据结构难度不大,除了根节点外,每个节点维护当前字符串当前字符的后一个可能出现的字符集合,即每个节点对应了一堆字符串公共前缀,由于字母一共只有26个,因此可以用一个26位的递归数组来表示,下一个字母对应的前缀。做完了哈希,来看看数据结构,做做字典树。字典树在搜索方面的作用还是蛮大的,主要是能实现前缀联想以及正确性匹配相关的功能。该数据结构仅做了解,并且在前缀相关操作时注意进行应用,其可以在。的复杂度下完成搜索插入以及前缀匹配等各种操作。
2025-05-20 15:26:21
299
原创 Leetcode百题斩-哈希
看来面试前还是要老老实实刷leetcode为好,今天看到一个题库,leetcode百题斩,刚好最近面试的这两题全在里面。那么,冲冲冲,看多久能把这百题刷完。那么排序肯定是排不了了,直接将数组维护在哈希集合中,遍历集合元素,针对每段连续序列的头节点(该数的前一个数不在集合中),向后判断该段连续序列长度。想到子串问题,当然就想到了前缀和。不过虽然这个算法将复杂度降下来了,但是最终的耗时其实还不如排序,可见现在的排序优化已经十分到位了。思路:最长连续序列,第一想法就是直接排序,然后进行统计。
2025-05-20 01:02:08
495
原创 最近公共祖先(LCA)
这题二叉树LCA就是个典型的dsf问题,不难发现,如果两个节点分别位于某个节点的左右子树时,该节点一定为LCA。Targen算法其实很好理解,就是典型的dfs后续遍历,在搜索的过程中,动态维护一下当前搜索区域内每个节点的父节点。最后注意一下,维护父节点的过程中,当前节点和所有子节点均需要同步被维护,因此这里需要用并查集算法进行优化一下即可。面完通义实验室,马不停蹄就去奔向通义app。作为阿里AI-to-C大业的一环,通义app联合夸克,被独立拎出,成立智能信息事业部,由吴嘉亲自掌管,其战略意义不言而喻。
2025-05-19 17:14:53
263
原创 最长回文子序列
回忆了xdoj的青春,做了那么多cf和atcoder,也该实践实践了,作为现在ai的时代,作为阿里系一员,首当其冲就是去试试通义实验室。通义实验室给了一道最长回文子序列题,一下干懵逼了。看起来是道很典型的题,但满脑子想着优化,想了好几种方法,左试试右试试,拿不定主意。再加上已经很久没人盯着写代码了,导致脑子一片浆糊,最终被迫降级写了一种最low的方法。。。现在想想其实每一种思路都是正确的,只是不同的复杂度罢了。
2025-05-18 05:11:19
779
原创 AtCoder Beginner Contest 403
没什么难度,但却因为没读清题目,要求输出Yes/No,结果输出了YES/NO,导致了三次无意义的WA,实属可惜。最后整理一下,其实并查集的主要就是为了优化连通集,但是这题的数组最大值只有1e6,因此可以直接用计数数组而放弃并查集优化,这样会使代码简洁一些。思路:给定一个数组a(2e5的数据量,最大值为1e6)和一个特定的数d,要求删除最少得数量是的数组内所有数的距离都不为d。题意倒是很简单,首先想到的将距离为d的数通过并查集连接,再通过遍历每一个连通集,进行间隔删除,最后找出最小的删除方案。
2025-05-13 00:31:51
373
原创 Codeforces Round 1020 (Div. 3)
然后枚举子串,判断其左右字符在父串中的双指针位置是否交叉(即不存在合法方案或者左右子串共用了相同位置的父串字符),最后找到最小的字符即可。思路:给定父子两个串,要求在父串中找到一个子序列,其长度与子串相同且对应每一位都比子串中的数大。若无法找到,则允许子序列少一位数,并任意添加一个数进入子序列,使得新的子序列满足要求。思路:有两个数串,其中一个串丢失了部分数字,现在要求两个串每一位的和都等于一个特定的数,求有多少种,补全缺失数字的方案。次机会不被翻转,而每一个出现的0都有一次机会被翻转,直接计算即可。
2025-05-11 02:01:02
463
原创 AtCoder Beginner Contest 402
再想想,其实每道题的最终作答顺序并不影响分数,而做对与否才真正影响分数(假设钱数能够答对对应的题目,如果钱不够导致后面的题无法做最终也将会体现在题目未达对上)。而不难发现这一题的n给的特别小,只有8,因此想到可以用状压dp,将每道题做对和做错的状态进行枚举压缩。解法也很简单,反向维护一下某个食材可能影响的食物,当某个人喜欢上某个食材的时候,更新一下所影响食物还剩余需要喜欢的食材数量,即可得到当前所喜欢的食材数量。思路:N个题,每题s分,消耗c金币,答对概率p,拥有总金币数量X,求最高分数的期望。
2025-05-11 00:52:22
835
原创 AtCoder Beginner Contest 401
每次针对下个节点,再将下个节点加回,并将下个节点的后续节点删掉即可。首先第一步,不难发现,如果每次要遍历的节点在待删除列表里,那么其一定是可以连通的,就不需要再进行连通性判断了。此外,由于待删除列表存在很多添加和删除的操作,因此用数组来维护判断节点是否需要删除,然后专门记个数即可。最后一点剪枝就是判断节点联通性的时候,当某个节点判断不连通时,可以短路掉后续要判断的节点,避免重复无效判定。思路:图论题,给定一个无向图,针对每一个有序节点k,判断需要至少删除多少个节点,能使节点1仅可达前k个节点。
2025-04-13 21:28:58
893
原创 Codeforces Round 1013 (Div. 3)
思路:这题就是个典型的策略题,要求每次旋转都只命中一个数,那么直接按照命中的数去生成串即可。其实可以不关注样例,直接自行选一个简单的策略为每次转一个就往前匹配一位,那么就可以按照数字从大到小排序,从末尾开始生成,每次向前移动两格,循环往复刚好可以匹配成功。思路:组队问题,n个人组队,队伍分数为人数*队内最小分数人,给定最小队伍分数,求最少组几队。埃氏筛十分好理解,针对每个素数,其任意倍数一定不是素数,于是遍历所有数,将其倍数标记为非素数,即可获得素数集合,这种算法的复杂度为。个区域,求最长区域。
2025-04-10 16:41:05
924
原创 xdoj回忆练
再拆解一步,就是从头开始累加模和,然后将累加模和相同的数进行分配,任选两个进行组合。不过这题有两个坑点,1是数较大,1e6的规模,因此要注意用长整型,特别是求模和运算的时候,求完和后一定要求模再进行分组计数,要不然很容易溢出。将数据归类,不然发现,所有符合要求的数,全都由13个基础数据组成(1,2,3,10,11,12,13,20,21,22,30,31),于是其实只要将每两位合并为一个13进制数,进行枚举,即可实现剪枝,于是,直接上代码。思路:比大小的模拟题,直接比一下,没什么说的,直接过。
2025-03-26 15:54:52
752
原创 基础排序大赏
排序算法乃最基础算法,作为CSers的必备算法,往往也是面试官比较青睐的考点。常见有序表排序算法主要有以下几种编号 排序类型 排序名称 平均时间复杂度 最坏时间复杂度 最优时间复杂度 空间复杂度 稳定性 1 比较类排序 交换排序 冒泡排序 稳定 2 快速排序 不稳定 3 插入排序 简单插入排序
2020-12-01 18:53:24
255
原创 链表交点问题
链表交点问题也属公司青睐的专题之一,一般依靠双指针来解决,主要分为链表判环和链表相交两大专题。142.Linked List Cycle II题意:判断链表是否有环,若有环,则返回环入口节点。思路:这题就是典型的快慢指针问题,代码很简单,但具体理论证明却十分值得研究。首先先说解法, 分两部分,判环和寻找入口:判环部分,设置两个指针(快指针fa一次走两个节点,慢指针sl一次走一个节点),若快指针走到了链表尾即空节点则说明链表无环,否则在环中快慢指针必能相遇。寻找入口部分,慢指.
2020-10-09 12:34:50
533
原创 最大子区域问题
最大子区域问题也是笔试面试非常常见的问题,典型的就是数组的最大子串和矩阵的最大子矩阵,一般伴随着求和求积这类操作。下面我们就来研究一下。53.Maximum Subarray题意:最大子区域问题的最经典类型就是数组的最大子区间和问题思路:dp枚举每个位置,动态维护以当前元素为结尾的最大子区间和总最大子区间,转移只需要与前项比较即可代码:/*Author Owen_Q*/class Solution {public: int maxSubArray(vec.
2020-10-08 17:51:30
755
原创 单调栈专题练--下一个更大元素
单调栈,主要用于记录数组中每个元素的下一个更大值。为了在O(n)时间复杂度内完成这个目标,需要从后往前维护一个单调递增栈,栈中依次存储当前下一个位置到数组尾的下一个更大值。因此,对于每个位置的更新,只需要从栈中将小值出栈,直到寻找到比当前值大的值即可。话不多说直接看题1019. Next Greater Node In Linked List题意:给定一个链表, 对于每个节点,记录链表中下一个比当前节点大的节点值,最终结果用数组返回。思路:寻找下一个更大节点问题,典型的单调栈问题
2020-10-08 15:17:52
394
原创 最大01子矩阵问题(单调栈优化)
题目描述:顾名思义,给定n*m大小的01矩阵,要求找到1数量最多的全1子矩阵问题降阶:思考二维问题前,先将问题降阶,思考该问题在一维状况下的解决方式会是一个比较好的思路。题目链接:485.Max Consecutive Ones题意:在01数组中寻找最长连续1的长度思路:简单的dp,维护数组中每个位置作为结尾的最长连续1长度。代码:/*Author Owen_Q*/class Solution {public: int findMaxCons.
2020-10-08 15:15:22
1414
1
原创 递归法求解面试三大经典链表问题
最近参加了一堆笔试面试模拟试,发现链表题是很多公司面试官所喜欢亲爱的一类题目,手撕链表的题目随处可见。毕竟,链表作为数据结构的基础,十分重要。而链表又恰恰是写代码中很容易出bug的一种数据结构,断链,空指针等各种问题经常让人猝不及防。这里,我总结了常见的三种最常见的链表题:链表翻转,链表合并,以及基于二叉链表的二叉树翻转。偶然间发现,递归法简直是处理这类问题的一大利器。利用递归法,可以完美避开链表的各大坑点,那么就让我们来试试吧。二叉树翻转题意:轴对称翻转一个二叉树思路:这道题简直就
2020-08-19 02:36:35
842
原创 Bestcoder-889-1004-Civilization(HDU6746)
题目链接题目链接(可提交)题意:经营模拟类游戏,n*n地图(5e2*5e2),每个地点有一定生产力a[i][j],初始位置在(x,y)建城市,初始居民1人第一阶段:移动城市,每天可以将城市移动到曼哈顿距离不超过2的地方。第二阶段:生产,在确保城市有人的前提下,多余的市民可以去离城市曼哈顿距离不超过3的地方生产第二阶段每天结算一次首先结算粮食,所有有居民的地点均可获得粮食a[i][j],粮食汇总到城市再结算人口,若当前城市总粮食数达到8倍人口数平方(food>=8*p*p
2020-08-12 05:34:13
185
原创 Bestcoder-892-1002-Binary Addition(HDU6839)
题目链接题目链接(可提交)题意:两个长为n(1e5)的二进制串a、b,小地址为低位,现在提供两种操作(任意更改一位,或整串二进制加以),问最少多少步可以使a串变为b串思路:策略题首先需要分析两种不同策略的优劣以及应用场景对于操作一,显然是基本操作,按位变换,最暴力的做法而相比较而言,操作二就是用来优化的,在某些特殊场景下,操作二可以对串造成较大的变化。显然,若从最低位开始有连续多个1时,一次操作二可以将这一系列多个连续的1全都变成0,从而达到一步操作更改多位的效果。而又由
2020-08-12 03:16:34
240
原创 Bestcoder-892-1001-Battle for Wosneth(HDU6838)
题目链接题目链接(可提交)题意:回合制游戏,Alice和Bob两人轮流攻击。Alice先手,每次成功的攻击自己获得1分,并给Bob造成一点血量损失,攻击命中率为p%;Bob血量为m(1e9),当血量减为0时,游戏结束,每次成功的攻击扣去Alice积分1分,攻击命中率为q%。求游戏结束时Alice积分的期望,结果对998244353取模。思路:期望游戏完全可以利用等效思维去考虑,那么游戏即可等效为:Alice攻击力为p%,Bob攻击力为q%不难发现,Alice自己所增加的积分一定为Bo
2020-08-11 23:24:52
216
原创 LeetCode-143-Reorder List
题目链接题意:重构一个单链表,O(1)空间复杂度条件下将链表L1~L2~L3~……~Ln-1~Ln重构为L1~Ln~L2~Ln-1~L3……思路:看似是一个双指针的题,一头一尾两个指针向中间合并。然而题目中的单链表这一数据结构使得尾指针无法向前移动,题目难度瞬间增大。于是,只能利用链表操作来完成。思路也比较清晰,关键就是链表操作细节点很多。化整为零,可以通过三个小操作来实现这个任务:1.将单链表一分为二2.将后半部分链表翻转3.再将两段链表合并下面详细来说明这三部分1
2020-08-09 07:56:41
244
原创 剑指 Offer(力扣版)-59-II-队列的最大值
题目链接题意:定义一个新队列数据结构,可以快速O(1)查找队中最大值思路:在队列中添加一个链表,用于维护当前队列最大值,该链表指向该最大值出队后剩余列表的最大值对于该新队列的三个基本操作:入队:...
2020-08-09 07:56:36
312
2017freshmen.pdf
2019-09-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人