自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 C. MEX Game 1

把这三个问题想清楚,我们就能做出这道题了,根据第一个条件,我们知道当我们找到第二个只出现了一次的数的时候,就要输出这个数了,或者这个数不存在,答案也是这个数,下面就是看这两种情况,哪个先出现了。2,那如果这个数多于两个,那也就是说,alice肯定能取得上,所以答案肯定不是出现次数多于一次的。所以遇到一道摸不着头脑的题的时候,先试着打表手动模拟一下,看看其中门道,多思考题中给出的关键信息。1,对于alice来说,先取小的,对于bob来说先删除alic想取的下一个小的。

2024-04-06 14:51:42 241

原创 线性动态规划

线性动态规划的意思就是在一维层面使用dp数组,动态规划最难的部分就是在确定状态转移方程,确定状态转移方程最好的方法莫过于打表手动找到规律,就是把一个大问题拆成几个小问题。我从洛谷上找了几道比较简单的题来分析一下。

2024-04-06 14:25:45 314

原创 C1. Bessie‘s Birthday Cake (Easy Version)

其实这个图形是几边形无所谓,只有x的值对我们是有用的,首先我们把点排序,然后组成一个新的图形来看,然后我们要数一下有几条不相交的对角线,很明显是x-3条,但是会隔成x-2个三角形,但是,数对角线的时候,我们把所有的点考虑成了相邻的,假如不相邻,就像case3一样,如果v [ i ] =v[ i-1 ]+2,那么相邻的边也可以组成一个三角形,所以需要相加,但别忘了,点是围成圈的,所以最后一个点单独拿出来考虑。这次比赛,前几题都比较善良,细心来看都会很快发现其中端倪,

2024-04-01 17:15:31 237

原创 B. Bessie and MEX

这道题我们首先模拟一下过程,mex-p[i]=a[i],那我们求的p[i]就是mex-a[i],a数组我们已知,只用来找到每轮的mex就可以,那怎么找mex呢,显而易见,每轮mex是与上一轮的mex有关系的,那到底是正着看还是倒着看呢,这取决于哪个位置的mex最显而易见,很明显就是最后一个位置,最后的mex一定是n,所以p[ n ]=n-a[ n ],而再往前看,下一轮的mex, 是上面已有的p[ i ] 中最小值,所以很明显就想出来是倒序遍历,我们再构建一个set容器,为了维护有序,方便找到最小值。

2024-04-01 17:00:15 126

原创 CF ROUND 163 B~D

看到这个以后,我们就其实暴力搜索一下就行,最长的长度就是字符串长度的一半,然后我们慢慢减少长度,看看哪个符合,倒序遍历,有助于我们找到最大的结果,找到后直接退出就好,节省时间,那我们怎么解决可能要删去的问题呢,首先可以肯定的是,要删去的东西一定构不成最长的相等序列,所以我们遍历的时候只用去记录可以构成的,也就是i 位置和 i + len的位置字符一样或者遇到了万能?这道题的题目大意是说,如果前面的数大于了后面的数,我就把它的个位和十位拆开,最后我看一下这个数组是否可以在n次操作后是一个非降序数组。

2024-03-17 19:42:38 344

原创 单调队列(347. 前 K 个高频元素239. 滑动窗口最大值)

每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。首先需要桶排序,看看谁出现次数多,然后构建小顶堆,因为进入一个元素,就排出去一个,如果是大顶堆,剩下的就是小的数,如果是小顶堆,剩下的就是大的数,此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。

2024-03-04 22:41:42 348

原创 栈与队列力扣经典例题20. 有效的括号1047. 删除字符串中的所有相邻重复项150. 逆波兰表达式求值

这道题,首先我们要知道哪些情况,是会使结果变为false的,第一种就是括号数是奇数,那肯定不能两两匹配,第二种就是括号数是偶数可以匹配,但是括号类型不对,就像case 3一样。对于栈与队列,我们首先要搞清楚,栈是先入后出,而队列是先入先出,利用这个特性,我们来判断题目用什么STL容器,便于我们去解决问题。这道题的思路就是,当我们碰到的是一个数时,我们就让它入栈,如果碰到一个运算符号,我们就进行对应的运算,再将运算结果入栈。

2024-03-03 14:22:58 430

原创 单调栈(一个感觉比较有用的优化技巧)

单调栈,顾名思义就是构建一个栈,保证这个栈里的元素是单调递增的,或者单调递减的,如果破坏单调性的元素,我们就让它出栈,所以当我们遇到一个题,它出现“更大”“更小”的意思,那么就可以用这个算法,比如我们有一队人,个子矮的视野会被后面个子高的人挡住,求每个人的视野,那么就可以用单调栈解决,我们后面会放几道经典例题,帮助理解在单调栈这一块,它的伪代码就是下面我们放一道经典例题,理解一下代码。

2024-03-02 23:26:22 352

原创 常见的优化技巧(TLE克星)

首先,我们都知道加快时间,但是这些方法都是治标不治本,很少情况可以通过这些解决,我们需要通过优化我们的算法来解决时间超限的问题利用哈希表,也就是桶排序来优化。

2024-03-01 23:12:57 362

原创 Vasya and Isolated Vertices

但最大值有点麻烦,一开始想错了,也就实现错了,没有想到内部也是可以连线的,也就是对角线,所以边想少了,其实也不用太去想的复杂了,一个公式就可以解决,就是当你用for循环遍历的时候,结果TLE了,那么你就要更改思路了,不要听题目说什么你就写什么,要搞懂题目的意思,巧妙地转化题目条件,本题条件就是。题目大意是,输入n,m两个数,n代表有n个点,m代表可以连m条边,但是不可以连同一条边,而且边是无向边,求被孤立的也就是没有边连的点的最小数和最大数。然后我们来实现一下,如果for循环超时,可以用二分法优化一下。

2024-02-29 19:00:02 826

原创 并查集(数据结构)

fa[x]存节点x的父节点就是为了找到某个点的根节点,如果找到了就返回,如果没找到就继续递归查找在返回的路上,顺带修改各节点的父节点为根,这样的好处就是,我遍历过一次的节点,那么下次再查找时就可以直接找到不用再来一次遍历,将两个集合合并在一起,拥有一个共同的根但是我们通常都是让小集合指向大集合,所以其实还可以再优化一下(但其实这步优化没必要,有上面路径压缩的优化足够了)来道例题练习一下。

2024-02-29 13:32:34 435

原创 力扣459. 重复的子字符串(kmp算法)

因为比如字符串s abababab,最长相等前后缀是ababab,s[0]s[1]与s[2]s[3]相同, s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同。aba的kmp[len-1]也不是0,但是不符合,所以我们需要再加一个限制条件,那就是len % (len - (kmp[len - 1] )) == 0。因为当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。,检查是否可以通过由它的一个子串重复多次构成。给定一个非空的字符串。

2024-02-29 09:56:23 382

原创 字符串之manacher(马拉车)算法

这个算法用途就是查找字符串内的最长回文串正常情况下,我们查找回文序列,会去用双指针比较,这样的话数据大的时候,时间复杂度就上去了,其实这个马拉车算法和kmp算法的一部分是有些相像的,建议先看我的上篇文章kmp算法在kmp算法中,最关键的点就是去回跳 j 指针,在马拉车算法中也是,为了 查找回文序列,我们引入一个概念叫做,它的意思是,比如aabaa,那么它的回文半径就是3aba回文半径就是1在字符之间和串两端插入#,改造后,都会变成奇回文串,方便统一处理s[0]='$'是边界。

2024-02-28 19:46:31 379

原创 字符串之KMP算法

大意就是可以找到 a 字符串中哪里出现了 b 字符串,同时可以记录出现了几次如果我们拿到一道题,问 a 串中是否包含了 b 串,第一反应是双指针,双层循环,暴力搜索,但是很明显,时间复杂度很高,为了节省这个时间复杂度,引入了kmp算法,在kmp算法中,最关键的就是kmp数组,kmp[i]是记录模式串也就是 b [1,i] 中相等前后缀的最长长度,双指针:i 扫描模式串,j 扫描前缀。初始化,kmp[1]=0,i=2,j=0;

2024-02-28 19:16:22 319

原创 字符串哈希

2,如果两个字符串不同,但是hash函数值却相同,我们把这种现象叫做哈希碰撞3,解决哈希碰撞的方法,那就是令p和M互质。

2024-02-28 18:43:38 327

原创 The Number of Products(两种解法,想了一晚上的成果~)

其实每个数我们不用看它的大小,只用看他的正负,所以我们把所有的正数都变为+1所有的负数都赋值为-1,然后我们看一个例子和图。第一种做法就是用dp动态规划,为什么会想到用dp呢,因为我们发现,后面出现正数或者负数,所能形成的数量是由前面决定的,如果a[i]>0,它对负数区间的贡献是前面子区间乘积>0的个数+1。如果a[i]0的个数+1。如果a[i]>0,它对正数区间的贡献是前面子区间乘积>0的个数。如果a[i]

2024-02-27 22:19:22 328

原创 Two Small Strings(简单的模拟+构造)

同样模拟题干意思,不能出现已经给出的样式,那我就写一个bool函数,判断一下,但是要注意啊。数组默认是从0开始,这样写出来以后样例它通过了,

2024-02-27 19:57:09 770

原创 Equalizing by Division (hard version)

正确思路是对每一个数都除以2,一直除以到0,来开一个map储存每个数,有点哈希表的感觉,细节在于要对原数组经行由小到大的排序,因为数越小肯定方案更优,下面放代码。题干大题意思就是要找到达到同一个数字,所需要的最小的操作步数,每次操作都是除以2,做的时候,(附带了快读快写的代码,可以节省很多时间)

2024-02-27 19:15:08 321

原创 最近公共祖先LCA(倍增算法优化)

此算法大题思路就是一层层往上查找,查找一层看一下两个节点的父节点是否相等,如果相等,那就说明找到了最近公共祖先,但是如果层数过多,就会增加时间复杂度,所以我们用倍增算法优化一下时间。(1)第一阶段,将u v跳到同一层,设u v的深度之差为y。将y二进制化,比如y=1019=512+256+~~~+8+2+1。最近公共祖先,顾名思义,就是查找最近的父节点。(2)将u v一起跳到LCA的下一层。1,dfs一遍,创造st表。2,利用st表求LCA。不越界则跳,共跳九次。

2024-02-27 13:23:26 319

原创 最小生成树详解(Prime算法和Kruskal算法)

3,按顺序枚举每一条边,如果这条边连接的两个点不在同一集合里,就把这条边加入最小生成树,并且合并两个集合,如果这两天边连接的两个点在同一集合里,就跳过。4,重复3步骤,直到选取了n-1条边(所以prime算法实质是在往出找点,而这个算法是在往出取边,所以上面算法是令cnt==n而本算法是n-1)Prime算法本质上就是Dijskatra算法,他们俩框架可以说是一模一样。下面我们说一下Kruskal算法,它的本质就是一个并查集,1,初始化并查集,把n个点放在n个独立的集合。同理,在搜索最小距离点时可以优化。

2024-02-27 11:37:53 600

原创 最短路Dijkstra算法

我们可以用大根堆来优化一下,因为优先队列是最大值优先而我们需要的是最小值,所以我们给所有的边长权值加个负号,这样负数的最大值便是正数的最小值。本算法大意就是从起始点出发,搜索起始点附近的点,看看哪条路最短,来更新最短路即可。d[u]存u到原点s最短距离,vis[u]表示u是否被访问过。初始时,vis=0 d[s]=0d[其他点]=inf。对这个点的所有出边进行松弛操作,就是更新邻边的最小距离。从没有标记的点中选择一个距离最小的点,打上标记。e[u]存节点u的终点和边权。但是因为在整个过程中,

2024-02-27 10:54:04 427

原创 cf902B Coloring a Tree

题目描述:You are given a rooted tree with n vertices. The vertices are numbered from 1 to n, the root is the vertex number 1.Each vertex has a color, let's denote the color of vertex v by cv. Initially cv = 0.You have to color the tree into the given colors us

2024-02-26 22:02:20 834

原创 优先队列(堆)poj1442Black Box

给定M个数,每次可以插入序列一个数;再给N个数,表示在插入第几个数时输出一个数,第一次输出序列中最小的,第二次输出序列中第二小的……以此类推,直到输出N个数。

2024-02-26 21:36:45 858

原创 深搜× 动态规划√(力扣62不同路径)

首先注意到只可以向下或者向右移动,看到这个题第一反应是图论,用深搜解决,实际上会tle,那换个角度看这道题,每一步都是由上一步来的,一个格子是通过 它上面的格子或者左边的格子走过来的,所以我们按照动态规划的五个步骤来做这道题。2,初始化时,我们注意到走在第一行和第一列都只有一种路径,所以把第一行和第一列都初始化为1。3,确定递推关系式 dp[i][j]=dp[i-1][j]+dp[i][j-1]1,dp[i][j]表示走到第i,j位置的路径。1. 向右 -> 向下 -> 向下。问总共有多少条不同的路径?

2024-02-26 13:59:02 352

原创 动态规划(初步)力扣509斐波那契数列

动态规划其实说白了就是一个for循环,最难的部分在于我们审题,去看dp数组的含义,并且确定dp数组的for循环遍历方式,F(n) = F(n - 1) + F(n - 2),其中 n > 1。开始,后面的每一项数字都是前面两项数字的和。在动态规划里debug的最好方法就是打印出来dp数组。是正序,是倒序还是可能所有的奇数所有的偶数分开遍历。2,初始化,dp[1]=1;1,dp[n]=m 表示第n个数是m。,所以我总结出做动态规划的五个步骤。5,试着推几个dp数,来演算,我们按步骤一步一步来。

2024-02-26 13:44:04 355

原创 链表之移除链表元素的三种方法

再往回“归”,递的时候,当发现节点为空时停止,开始往回归,判断是否节点满足条件,开始移除节点操作。第三种方法就是递归,这种方法较难理解,建议新手使用第二种方法,递归就是,先往下“递”引入力扣的203移除链表元素。,请你删除链表中所有满足。给你一个链表的头节点。

2024-02-26 13:15:25 804

原创 哈希表(力扣1两数之和)

所以本题很明显是用unordered_map,因为要查找同一个数组中相加和为一个定值的两个数,如果用最平常想法就是两个for循环遍历,但是很明显,两个for循环会导致TLE,所以我们压缩为一个for循环,通过val=target-nums【i】哈希表的一大缺点就是如果数字跨度过大的话,那么数组会开的很大,比如储存1~10000之间某些数的出现次数,可能只出现1和10000两个数,但是数组却得开nums【10001】,甚至在遍历的时候也会很消耗时间和空间,整数,并返回它们的数组下标。,请你在该数组中找出。

2024-02-26 09:38:09 362

原创 哈希表(力扣202快乐数)

对于 unordered_set 容器不以键值对的形式存储数据,读者也可以这样认为,即 unordered_set 存储的都是键和值相等的键值对,为了节省存储空间,该类容器在实际存储时选择只存储每个键值对的值。编写一个算法来判断一个数。

2024-02-26 09:18:42 347

原创 哈希表 力扣349

思路:本题除了哈希表还要用到set,因为我们发现到只用找到两个数组里面的交集,重复是不作数的,所以用set去除重复的数,然后哈希表是为了记录是否出现过。输出结果中的每个元素一定是。

2024-02-25 22:05:48 316

原创 哈希表(字符串)力扣242

哈希表其实就是排序里面的桶排序,实质就是一个数组,只不过数组里面的是一个计算。可以通过下面的题目来理解字符串哈希。中每个字符出现的次数都相同,则称。,编写一个函数来判断。

2024-02-25 21:54:45 333

原创 力扣59.螺旋矩阵II(模拟)

值得注意每圈循环的时候,都要减去对应的值,也就是offset,以及初始的坐标startx,starty都要++整个算法就是一个普通的模拟算法,模拟整个顺时针放入宫格的过程,就是搞清楚要循环几圈,这个螺旋矩阵的思想将来运用于在宫格里顺时针或者逆时针往里面放。所有元素,且元素按顺时针顺序螺旋排列的。

2024-02-24 20:21:58 311

原创 滑动窗口(力扣209)

滑动窗口其实实质上就是双指针,怎么实现让窗口滑动起来呢,就是用 i , j 指针,让 j 指针遍历,遇到符合的条件再移动 i 指针,再定义一个length计量窗口长度,length=j-i+1;如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。

2024-02-24 19:59:47 358

原创 双指针(比较大小)力扣977

第一思路就是暴力求解,直接给所有数字平方,在排序,最后输出。第二种思路就是双指针,一头一尾,比较大小,移动指针,平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]注意只有当满足条件时才移动对应的指针。组成的新数组,要求也按。

2024-02-23 14:40:14 351

原创 双指针(快慢指针)(相向指针)力扣27

你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。)第二种就是用双指针的快慢指针,我们不妨逆思维想一下问题,去除目标元素是不是和保留剩余元素是一样的,所以我们可以用快指针fast去遍历数组,用满指针slow去收集剩余元素。你不需要考虑数组中超出新长度后面的元素。你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须仅使用。的元素,并返回移除后数组的新长度。

2024-02-22 23:01:49 349

原创 二分法(力扣704)

对于二分法,我们先要搞定,到底是开区间还是闭区间,其次就是由于开闭区间的不同,会导致部分代码出现轻微区别。这是最关键最容易错误的!详细的解释和代码在下面。

2024-02-22 22:14:03 424

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除