- 博客(133)
- 资源 (1)
- 收藏
- 关注
原创 AtCoder Beginner Contest 409
第二发针对在数组中的场景,发现a[i]=i+1的边界条件未被考虑,第三发针对找不到的场景,应该直接将结果设置为数组大小,特别是第三发wa,我深知考虑到了这种case,但却莫名其妙的想当然认为0就是这种case的正确结果,也是不理解脑子一团混乱。这题其实脑子也糊了一下,一开始只记录每个点位的位置,但没统计每个位置的数量,导致怎么都出不来结果,果然还是受第二题卡顿的影响了。思路:旋转字符串,寻找字符串的一个子串,将其整体想坐旋转一位,求一个最佳旋转方案,使得旋转后的字典序最小。最后手动模拟一下字符串旋转即可。
2025-06-12 11:11:34
396
原创 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
926
原创 Codeforces Round 1029 (Div. 3)
常规操作就是将某个数组中的第i位设置为第二个数组中的第i+1位,该操作可以进行无数次。这就是一个贪心的策略,从后往前遍历,每一轮要求遍历所有现有的元素,即为完整的一个集合。思路:有n个门,部分门开部分门关,每经过一个门耗时一秒,现在有个按钮可以让所有门关的门打开k秒,问人能否顺利通过。方案1:如果某个数组中连续两个数相同,则另一个数组中前一个位置一定也能变成这个数,即前方的位置即可以为答案。方案2:如果数组中某个位置k,其数在任意数组的第k+1位(不包含)之后出现过,则位置k也可以为答案。
2025-06-10 01:47:06
262
原创 Codeforces Round 1027 (Div. 3)
此外,因为每次移动串至少影响两个对称位置数,所以该数量的奇偶性一定保持一致,因此判断一下上下界再判断一下奇偶即可。最近小红书的面试,做到算法题感觉明显自信了很多,自信还是能带来一点加成的,最后面试官直接不让我手撕代码了,直接说你肯定会下个环节吧哈哈。思路:每个节点本身有一个防御值,其通向根节点的路径上每个路径有一个防御值(等于当前节点防御值依次加/减下一个节点的防御值,没经过一个节点变换一次加减符号)。求每个节点的最大防御值,那么其实只要从根节点开始递归维护每个节点的最大和最小防御值即可。
2025-05-28 00:22:51
421
原创 AtCoder Beginner Contest 407
思路:给定一个数组,要求用括号串覆盖数组,最终将所有左括号覆盖除累加求最大值。其实说白了,引入括号串就是为了利用栈的性质,即要保证每一位顺序做选择时,累加的数一定要比丢弃的数多。看这么小的数据量,直接枚举判断即可,最后要注意一下,由于概率判定精确到了小数点后九位,所以一定要拉长最终输出的位数。终于涨分了,这算是这段时间来第一次涨分,之前一直都再降,看来终于算是找回了一点点当年的感觉了。,就是前面的数尽可能累加,后面的数全都丢失。最近的正整数,由于是正整数,就简单了直接求两边的数对比一下即可。
2025-05-26 11:31:09
511
原创 Leetcode百题斩-二叉树
二叉树作为经典面试系列,那么当然要来看看。总计14道题,包含大量的简单题,说明这确实是个比较基础的专题。快速过快速过。先构造一个二叉树数据结构。
2025-05-26 00:26:50
894
原创 Leetcode百题斩-回溯
回溯是一个特别经典的问题,也被排在了百题斩的第一部分,那么我们接下来来过一下这个系列。这个系列一共八道题,偶然间发现我两年前还刷到这个系列的题,回忆起来当时刚经历淘系大变动与jf出走海外事件,大量同事离职闹得人心慌心慌,可能是当时也心生担忧于是未雨绸缪了一下。不知不觉已经过了三年安稳的日子了,生于忧患死于安乐,该努力起来了时间有点久远,记忆逐渐忘却了,之前用c++去攻取,那么这次用java重写一轮看看感觉如何。
2025-05-22 02:01:33
898
原创 Leetcode百题斩-字典树
字典树又名前缀树,顾名思义就是维护字符串的前缀。这个数据结构难度不大,除了根节点外,每个节点维护当前字符串当前字符的后一个可能出现的字符集合,即每个节点对应了一堆字符串公共前缀,由于字母一共只有26个,因此可以用一个26位的递归数组来表示,下一个字母对应的前缀。做完了哈希,来看看数据结构,做做字典树。字典树在搜索方面的作用还是蛮大的,主要是能实现前缀联想以及正确性匹配相关的功能。该数据结构仅做了解,并且在前缀相关操作时注意进行应用,其可以在。的复杂度下完成搜索插入以及前缀匹配等各种操作。
2025-05-20 15:26:21
277
原创 Leetcode百题斩-哈希
看来面试前还是要老老实实刷leetcode为好,今天看到一个题库,leetcode百题斩,刚好最近面试的这两题全在里面。那么,冲冲冲,看多久能把这百题刷完。那么排序肯定是排不了了,直接将数组维护在哈希集合中,遍历集合元素,针对每段连续序列的头节点(该数的前一个数不在集合中),向后判断该段连续序列长度。想到子串问题,当然就想到了前缀和。不过虽然这个算法将复杂度降下来了,但是最终的耗时其实还不如排序,可见现在的排序优化已经十分到位了。思路:最长连续序列,第一想法就是直接排序,然后进行统计。
2025-05-20 01:02:08
467
原创 最近公共祖先(LCA)
这题二叉树LCA就是个典型的dsf问题,不难发现,如果两个节点分别位于某个节点的左右子树时,该节点一定为LCA。Targen算法其实很好理解,就是典型的dfs后续遍历,在搜索的过程中,动态维护一下当前搜索区域内每个节点的父节点。最后注意一下,维护父节点的过程中,当前节点和所有子节点均需要同步被维护,因此这里需要用并查集算法进行优化一下即可。面完通义实验室,马不停蹄就去奔向通义app。作为阿里AI-to-C大业的一环,通义app联合夸克,被独立拎出,成立智能信息事业部,由吴嘉亲自掌管,其战略意义不言而喻。
2025-05-19 17:14:53
247
原创 最长回文子序列
回忆了xdoj的青春,做了那么多cf和atcoder,也该实践实践了,作为现在ai的时代,作为阿里系一员,首当其冲就是去试试通义实验室。通义实验室给了一道最长回文子序列题,一下干懵逼了。看起来是道很典型的题,但满脑子想着优化,想了好几种方法,左试试右试试,拿不定主意。再加上已经很久没人盯着写代码了,导致脑子一片浆糊,最终被迫降级写了一种最low的方法。。。现在想想其实每一种思路都是正确的,只是不同的复杂度罢了。
2025-05-18 05:11:19
756
原创 AtCoder Beginner Contest 403
没什么难度,但却因为没读清题目,要求输出Yes/No,结果输出了YES/NO,导致了三次无意义的WA,实属可惜。最后整理一下,其实并查集的主要就是为了优化连通集,但是这题的数组最大值只有1e6,因此可以直接用计数数组而放弃并查集优化,这样会使代码简洁一些。思路:给定一个数组a(2e5的数据量,最大值为1e6)和一个特定的数d,要求删除最少得数量是的数组内所有数的距离都不为d。题意倒是很简单,首先想到的将距离为d的数通过并查集连接,再通过遍历每一个连通集,进行间隔删除,最后找出最小的删除方案。
2025-05-13 00:31:51
351
原创 Codeforces Round 1020 (Div. 3)
然后枚举子串,判断其左右字符在父串中的双指针位置是否交叉(即不存在合法方案或者左右子串共用了相同位置的父串字符),最后找到最小的字符即可。思路:给定父子两个串,要求在父串中找到一个子序列,其长度与子串相同且对应每一位都比子串中的数大。若无法找到,则允许子序列少一位数,并任意添加一个数进入子序列,使得新的子序列满足要求。思路:有两个数串,其中一个串丢失了部分数字,现在要求两个串每一位的和都等于一个特定的数,求有多少种,补全缺失数字的方案。次机会不被翻转,而每一个出现的0都有一次机会被翻转,直接计算即可。
2025-05-11 02:01:02
447
原创 AtCoder Beginner Contest 402
再想想,其实每道题的最终作答顺序并不影响分数,而做对与否才真正影响分数(假设钱数能够答对对应的题目,如果钱不够导致后面的题无法做最终也将会体现在题目未达对上)。而不难发现这一题的n给的特别小,只有8,因此想到可以用状压dp,将每道题做对和做错的状态进行枚举压缩。解法也很简单,反向维护一下某个食材可能影响的食物,当某个人喜欢上某个食材的时候,更新一下所影响食物还剩余需要喜欢的食材数量,即可得到当前所喜欢的食材数量。思路:N个题,每题s分,消耗c金币,答对概率p,拥有总金币数量X,求最高分数的期望。
2025-05-11 00:52:22
820
原创 AtCoder Beginner Contest 401
每次针对下个节点,再将下个节点加回,并将下个节点的后续节点删掉即可。首先第一步,不难发现,如果每次要遍历的节点在待删除列表里,那么其一定是可以连通的,就不需要再进行连通性判断了。此外,由于待删除列表存在很多添加和删除的操作,因此用数组来维护判断节点是否需要删除,然后专门记个数即可。最后一点剪枝就是判断节点联通性的时候,当某个节点判断不连通时,可以短路掉后续要判断的节点,避免重复无效判定。思路:图论题,给定一个无向图,针对每一个有序节点k,判断需要至少删除多少个节点,能使节点1仅可达前k个节点。
2025-04-13 21:28:58
877
原创 Codeforces Round 1013 (Div. 3)
思路:这题就是个典型的策略题,要求每次旋转都只命中一个数,那么直接按照命中的数去生成串即可。其实可以不关注样例,直接自行选一个简单的策略为每次转一个就往前匹配一位,那么就可以按照数字从大到小排序,从末尾开始生成,每次向前移动两格,循环往复刚好可以匹配成功。思路:组队问题,n个人组队,队伍分数为人数*队内最小分数人,给定最小队伍分数,求最少组几队。埃氏筛十分好理解,针对每个素数,其任意倍数一定不是素数,于是遍历所有数,将其倍数标记为非素数,即可获得素数集合,这种算法的复杂度为。个区域,求最长区域。
2025-04-10 16:41:05
890
原创 xdoj回忆练
再拆解一步,就是从头开始累加模和,然后将累加模和相同的数进行分配,任选两个进行组合。不过这题有两个坑点,1是数较大,1e6的规模,因此要注意用长整型,特别是求模和运算的时候,求完和后一定要求模再进行分组计数,要不然很容易溢出。将数据归类,不然发现,所有符合要求的数,全都由13个基础数据组成(1,2,3,10,11,12,13,20,21,22,30,31),于是其实只要将每两位合并为一个13进制数,进行枚举,即可实现剪枝,于是,直接上代码。思路:比大小的模拟题,直接比一下,没什么说的,直接过。
2025-03-26 15:54:52
698
原创 基础排序大赏
排序算法乃最基础算法,作为CSers的必备算法,往往也是面试官比较青睐的考点。常见有序表排序算法主要有以下几种编号 排序类型 排序名称 平均时间复杂度 最坏时间复杂度 最优时间复杂度 空间复杂度 稳定性 1 比较类排序 交换排序 冒泡排序 稳定 2 快速排序 不稳定 3 插入排序 简单插入排序
2020-12-01 18:53:24
246
原创 链表交点问题
链表交点问题也属公司青睐的专题之一,一般依靠双指针来解决,主要分为链表判环和链表相交两大专题。142.Linked List Cycle II题意:判断链表是否有环,若有环,则返回环入口节点。思路:这题就是典型的快慢指针问题,代码很简单,但具体理论证明却十分值得研究。首先先说解法, 分两部分,判环和寻找入口:判环部分,设置两个指针(快指针fa一次走两个节点,慢指针sl一次走一个节点),若快指针走到了链表尾即空节点则说明链表无环,否则在环中快慢指针必能相遇。寻找入口部分,慢指.
2020-10-09 12:34:50
518
原创 最大子区域问题
最大子区域问题也是笔试面试非常常见的问题,典型的就是数组的最大子串和矩阵的最大子矩阵,一般伴随着求和求积这类操作。下面我们就来研究一下。53.Maximum Subarray题意:最大子区域问题的最经典类型就是数组的最大子区间和问题思路:dp枚举每个位置,动态维护以当前元素为结尾的最大子区间和总最大子区间,转移只需要与前项比较即可代码:/*Author Owen_Q*/class Solution {public: int maxSubArray(vec.
2020-10-08 17:51:30
748
原创 单调栈专题练--下一个更大元素
单调栈,主要用于记录数组中每个元素的下一个更大值。为了在O(n)时间复杂度内完成这个目标,需要从后往前维护一个单调递增栈,栈中依次存储当前下一个位置到数组尾的下一个更大值。因此,对于每个位置的更新,只需要从栈中将小值出栈,直到寻找到比当前值大的值即可。话不多说直接看题1019. Next Greater Node In Linked List题意:给定一个链表, 对于每个节点,记录链表中下一个比当前节点大的节点值,最终结果用数组返回。思路:寻找下一个更大节点问题,典型的单调栈问题
2020-10-08 15:17:52
379
原创 最大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
1370
1
原创 递归法求解面试三大经典链表问题
最近参加了一堆笔试面试模拟试,发现链表题是很多公司面试官所喜欢亲爱的一类题目,手撕链表的题目随处可见。毕竟,链表作为数据结构的基础,十分重要。而链表又恰恰是写代码中很容易出bug的一种数据结构,断链,空指针等各种问题经常让人猝不及防。这里,我总结了常见的三种最常见的链表题:链表翻转,链表合并,以及基于二叉链表的二叉树翻转。偶然间发现,递归法简直是处理这类问题的一大利器。利用递归法,可以完美避开链表的各大坑点,那么就让我们来试试吧。二叉树翻转题意:轴对称翻转一个二叉树思路:这道题简直就
2020-08-19 02:36:35
832
原创 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
174
原创 Bestcoder-892-1002-Binary Addition(HDU6839)
题目链接题目链接(可提交)题意:两个长为n(1e5)的二进制串a、b,小地址为低位,现在提供两种操作(任意更改一位,或整串二进制加以),问最少多少步可以使a串变为b串思路:策略题首先需要分析两种不同策略的优劣以及应用场景对于操作一,显然是基本操作,按位变换,最暴力的做法而相比较而言,操作二就是用来优化的,在某些特殊场景下,操作二可以对串造成较大的变化。显然,若从最低位开始有连续多个1时,一次操作二可以将这一系列多个连续的1全都变成0,从而达到一步操作更改多位的效果。而又由
2020-08-12 03:16:34
235
原创 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
210
原创 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
236
原创 剑指 Offer(力扣版)-59-II-队列的最大值
题目链接题意:定义一个新队列数据结构,可以快速O(1)查找队中最大值思路:在队列中添加一个链表,用于维护当前队列最大值,该链表指向该最大值出队后剩余列表的最大值对于该新队列的三个基本操作:入队:...
2020-08-09 07:56:36
302
原创 LeetCode-54-Spiral Matrix
题目链接题意:回形输出一个矩阵思路:将上下左右四条边作为四个不同的操作单独处理,并动态记录边界代码:/*Author Owen_Q*/class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int M = matrix.size(); vector<int> re;
2020-08-08 01:01:55
184
原创 Bestcoder-889-1003-Dec(HDU6745)
题目链接题意:给定a(1e3),b(1e3)两个正整数,每回合选取一个大于1的数减1,直至两个数均变为1求过程中两个数互质的最少回合数,多组数据(1e6)思路:这题看似是个策略题,1e6的数据量把策略的复杂度限制到常数级别,极其困难于是想到改在线查询为离线查询,预处理好所有可能的结果并存储备用,研究一下复杂度为1e6,可行于是选择dp,从最终终止条件a=b=1开始逆向转移,每种状态均可由a或b减1转移来,若互质即结果加1代码:/*Author Owen_Q*/.
2020-07-22 05:37:37
212
原创 Bestcoder-889-1002-GPA(HDU6744)
题目链接题意:四门课考试,每课最高100分,最低0分,给定特定gpa换算算法已知最终百分制总分,求最高gpa绩点,多组数据(4e2)思路:最暴力的做法当然是暴力枚举四门课的所有可能百分制分数分配方案,貌似复杂度完全ok这里稍稍改进一下,选取3+1枚举方式,暴力枚举前三科,利用最后一课进行查询当然最优方案应为2+2枚举方式,思路与3+1枚举相同,这里以3+1枚举为例代码:/*Author Owen_Q*/#include <bits/stdc++.h>
2020-07-22 05:19:15
265
原创 Bestcoder-889-1001-Drink(HDOJ6743)
题目链接题意:有n(1e2)种不同无限数量饮料,每种饮料提供x[i](1e2)水分,补充y[i](1e2)卡路里。现在只选择一种饮料,整瓶整瓶喝,需要补充m(1e5)水分,并使得摄入卡路里最少。问卡路里的最低摄入值思路:这一题读题很关键。一定要注意是只选一种饮料一直喝!看清这个,一切就都很简单了,枚举每一种饮料,计算当补充满水分时所摄入的卡路里量,最后输出最小值即可。代码:/*Author Owen_Q*/#include <bits/stdc++.h&g
2020-07-22 05:07:17
215
原创 Codeforces Round #630 (Div. 2)
疫情当下,刷题或许能成为一种不错的缓解无聊的方式A. Exercising Walk题意:矩形区域内,给定一定数量上下左右四种行走操作数量,问是否能在规定区域能完成而不超届。思路:上下,左右每对对立的操作只需要考虑之间的差,然后判断是否超界即可。因为,每对操作可以相互抵消。最后考虑一种特殊情况,就是对立操作刚好数量相同,检测一下两边是否有至少一个空间来执行操作即可。代码...
2020-04-01 23:05:42
265
原创 Virtualbox Ubuntu 输入法
输入法的重要性当然不言而喻了,可不希望每次想输入中文的时候都依靠在线输入法。于是这个来安装一下搜狗输入法1.安装一下中文语言包在设置中找到语言选项选择简体中文,安装2.安装fcitx输入框架sudo apt-get install fcitx3.下载输入法进入搜狗官网下载输入法4.修改框架再返回刚刚安装语言包的界面,修改输入框架为fcitx...
2020-02-03 04:17:10
3699
2
原创 Virtualbox Ubuntu增强功能
增强功能可谓是virtualbox的一大特色全屏显示首先,对于过小的屏幕,无疑是使用时特别难受的一点。而安装增强功能即可解决屏幕过小的问题简单的一步小小的操作即可时间,按步骤安装即可共享文件夹当然,如何实现windows和虚拟机linux之间的文件传输,也是一个很重要的问题。而共享文件夹,使得windows和linux中都可以访问到这个文件夹,即可完美解决这个问题...
2020-02-03 03:33:06
1424
原创 LeetCodeGOGOGO刷题记07——备战Amazon(Online_Assessment前的终章)
1122.Relative Sort Array难度:Easy思路:给定一个array和一个set,保证set中的元素均在array中出现了,要求将array按照set中的顺序排序,对于未在set中出现的元素从小到大排在array末尾复杂排序,考虑到直接建立一个新数据结构专门进行排序,num表示该数数值,value表示该数在set中出现的位置,对于未在set中出现的元素,其v...
2020-01-21 23:43:46
562
原创 LeetCodeGOGOGO刷题记06——夯实基础(预处理)
994.Rotting Oranges难度:Easy思路:图论题,一个图中若干好橘子和若干坏橘子,每回合坏橘子周围的好橘子会坏掉,问第几回合后没有坏橘子。比较流行的思路就是bfs,以坏橘子作为起点,一层层搜,搜完即可得到回合数确实这种思维很好想,但比起bfs,普通按回合grow&check要好写多了简简单单才是真,踏踏实实按回合走,思路清晰好写,而且代码效率极...
2020-01-21 20:58:38
316
原创 LeetCodeGOGOGO刷题记05——备战Amazon(打表,dp,刷刷刷)
1.Two Sum难度:Easy思路:刷到了leetcode的第一道题,求两数和等于特定值的pair,考虑到题号和难度,直接双循环暴力,解决什么?哈希优化?还有啥啥啥优化?这种题还优化个啥?赶紧看下一题去,别在水题上浪费时间!代码:/*Author Owen_Q*/class Solution {public: vector<int> ...
2020-01-21 20:32:20
306
原创 LeetCodeGOGOGO刷题记04——代码优化(预处理)
第一次完整的在线模拟,总体感觉就是思路清晰很重要,做完题目回头来看难度并不大,但如果能利用预处理,使得整体思路更加清晰,就可以使得编码更加轻松高效836.Rectangle Overlap难度:Easy思路:给两个矩形,判断两个矩形是否重叠。显然是分类讨论。看似很复杂,会有很多不同情况的样子,然而仔细想清楚,情况也很简单。首先,确定下左侧的矩阵。右侧的矩阵若不重叠,只...
2020-01-19 23:41:36
271
原创 LeetCodeGOGOGO刷题记03——代码优化(利用字符串流和c++11新功能来处理字符串)
819.Most Common Word难度:Medium思路:字符串处理问题,预先排除一部分单词,组成单词库(banned),要求找出一篇文章中出现最多的非banned单词(大小写不敏感)。这题思路也十分清晰,首先处理文章,将其处理成一个一个单词,并全部转化为小写,然后依次插入unordered_map中,最后遍历map得到结果其实这题的难度不大,然而常规代码并不简单,...
2020-01-19 01:11:30
208
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人