- 博客(37)
- 收藏
- 关注
原创 学习总结2.19
并查集与二叉树基于祖先节点与叶子节点来思考,通过父与子节点的关系来将问题串在一起,并查集核心由寻找父节点的函数,初始化所有节点的父节点与将当前节点与其他节点连接三部分组成,二叉树则可以灵活与其他函数结合,比如后缀表达式和医院设置,有很强的拓展性。栈和队列的代码比较类似,栈需要顶部指针,出入栈,判断栈是否为空等函数,队列需要头部尾部指针,结构化,出入队等函数,通常队列代码多与其他函数一起使用(有时候用循环和重置也可以替代队列,如约瑟夫环)
2025-02-19 21:26:01
319
原创 学习总结2.18
在原本基本的数船的基础上,增加了船不能畸形的要求,船只能是矩形,由此需要在dfs找船前确定是否有畸形船。出现畸形船的情况如上图,即两艘船有一个交集时,此时就可以判断出bad placement。就当熟悉了bfs的函数。
2025-02-18 19:31:36
297
原创 学习总结2.14
深搜将题目分配,如果是两个题目,就可以出现左左,左右,右左,右右四种时间分配,再在其中找最小值,即是两脑共同处理的最小值。比较简单的dp01背包。
2025-02-14 19:23:54
456
原创 学习总结2.12
通过链表的next指向下一个元素,链表可以当做一个二维数组,第一列指向下一个元素,第二列为元素本身,三个操作的注释在代码中。寻找到需要去到的最远的点,然后在该点至终点之间找到代价最小的一个节点,在此处回头,便可满足题目条件。
2025-02-12 19:42:49
217
原创 学习总结2.11
多列几个例子就可以发现其中的规律,通过一个变量的0与1来判断当前是否应该将数字寄存,由于按递增序列输出,只需判断当前时间段是否可以完成任务即可。
2025-02-10 20:36:52
175
原创 学习总结2.9
记录每个节点的左右叶子节点及其价值,将每个节点的父亲节点和叶子结点确定,通过循环将每个节点放在循环中,又通过循环来dfs,如果当前节点有父亲节点,就先遍历父亲节点,其次是其左右叶子节点。通过visit数组来判断节点有没有被遍历过,如有则停止当前深搜,未有则继续深搜。
2025-02-09 21:01:28
235
原创 学习总结2.7
将入栈元素结构化为含括号字符和所处数组位置的结构体,在从左往右遍历字符串后,通过是否被标记来在输出时做出操作。将其定义为二维队列数组来储存两个元素,类似桶排的思路,如果国籍数组由正数变为0,即少一个国籍。最后只有70分,还有30分超时了。
2025-02-07 19:48:45
143
原创 学习总结2.5
二叉树的核心函数为dfs,bfs,栈的代码,该题为寻找最深的叶子节点,便使用dfs。先单独确定最初的父亲节点,按照深搜的顺序输出当前深搜节点,即使答案。要先确定最初的父亲节点开始深搜,然后即可。
2025-02-05 19:17:48
236
原创 学习总结2.3
在用for循环遍历时,用滚动数组记录当前最大的价值,不断更新。可以将两个数字当做滚动数组的二个维度,将各个组中的重量和价值用二维数组记录。01背包的二维数组与一维数组。完全背包的二维数组和一维数组。
2025-02-03 19:52:42
194
原创 学习总结1.26
使用路径压缩:第一次查找5的根节点时,路径压缩会将5及其所有先前节点直接连接到根节点1,下次再查找5的根节点时,直接返回1,路径长度为1。未使用路径查询:如果要查找5的根节点,需要逐级向上查找,路径长度为4,下次查找5的根节点时,仍要逐级向上查找。并查集,需要将每次合并的两个单位归为一个合集中,查询时要确认2个元素是否在同一个合集里。核心函数为查询当前元素的父节点,然后根据操作的不同来进行合并亦或查询。假设并查集有右边的状态 1->2->3->4->5。该操作可以提高查找操作的效率降低时间复杂度。
2025-01-25 21:08:49
146
原创 学习总结1.24
题目中最大的正方形边长为2,换算为前缀和计算这个正方形的时候,发现正方形的右下角和为4正好为边长的平方,以此类推,若存在边长为3的正方形,其右下角便为3的平方,依此便可以寻找最大正方形的边长。k为边长,判断式:pre[i+k-1][j+k-1]-pre[i-1][j+k-1]-pre[i+k-1][j-1]+pre[i-1][j-1]==k*k。前缀和公式为:pre[i][j]=pre[i][j-1]+pre[i-1][j]-pre[i-1][j-1]+a[i][j]
2025-01-24 22:10:48
187
原创 学习总结1.21
这里需要用动态dp的思想,在这里定义一个二维数组dp[i][j],记录前i件物品在背包容量为j的情况下能获得的最大价值。对于第i棵草药,可以有采与不采的区别,将其分解为2个方向。将dp数组由二维转换为一维,用第一种草药记录相应价值,然后用第二种草药在第一种草药拉出来的dp数组遍历,记录各个情况下的最优解,以此类推。状态转移方程 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])dp二维数组相当于记录各个情况下的最优解,因此数组最右下角的元素就是最大的总价值。
2025-01-21 21:32:47
349
原创 学习总结1.20
从第二个数开始,便拥有了子段,将其与之前的数组元素相加,通过判断当前字段的和相比当前元素是否变大,可以得知子段是增大还是减小,因为要求最大子段和,所以当前元素进入子段和如果变大,就可以继续循环,如果变小,就要及时止损,使最大子段和的起点变为当前元素。本题递归的核心是将其分为两种情况,即空着一个盘子和所有盘子都放一个苹果,以这种递归思想然后层层深入,直到苹果数量为0时,便递归到了终点。同时还有某一情况下盘子数多余苹果数的情况,多出的盘子相当于空放,这种情况等同于在两者数量相等的时候递进。
2025-01-20 19:00:00
330
原创 学习总结1.19
用栈来储存下标和与剩余数组的序号作比较,通过比较后,栈中留下较大的元素,方便与剩余数组元素比较。之前的代码存在问题,现在的代码已经可以了。
2025-01-19 21:30:42
200
原创 学习总结1.17
代码方面,通过定义一个新函数达到标记已确定点的延伸范围,由于深搜是以行为单位进行的,所以只需要确定点所在列与斜行。通过将棋盘初始化为0,标记点及其延伸范围标记为1,若在当前行确定一个棋子,则深搜下一行;上方为棋盘表格,绿色斜行的横纵坐标相加得到的是同一个数,黄色斜行横纵坐标相减得到的也是同一个数,所以对于一个棋子,用3个一维数组即可确定其延伸范围。以行为深搜起点,读取当前位置的列,两列斜行是否在有已标记的点的延伸范围内,反复深搜直到6个棋子被找齐,然后再回溯找到第一个棋子,重复深搜至找完所有摆法。
2025-01-17 20:39:51
379
原创 学习总结1.16
栈的进出入并非简单的顺逆序,通过top指针指向a栈的顶部元素,在b栈中的b[i],若栈顶为b[i],则出栈且i++;若栈顶为非b[i],便重复将下一个元素放入a栈,直到栈顶为b[i]或者top指针与n-1相等。以行为深搜起点,读取当前位置的列,两列斜行是否在有已标记的点的延伸范围内,反复深搜直到6个棋子被找齐,然后再回溯找到第一个棋子,重复深搜至找完所有摆法(代码明天发,今天代码还有问题)如果最后b[i]与栈顶元素不同,则意味着无法输出b序列。
2025-01-16 19:45:07
228
原创 学习总结1.15
这个题有点棘手,感觉要弄懂并写清代码还有一定距离,然后今天多花了点时间在英语上,感觉单耗在这上面也不是个头。通过两个数组达到记录各个集装箱的重量与当时最大重量的集装箱,减少对一个数组反复处理而使得代码冗长。
2025-01-15 21:31:37
198
原创 学习总结1.14
读取输入的字符数组后,需要一个与其规格一致的数字字符,通过0与1来判断字符数组内的元素是否为‘yizhong’中的任意一个,其次需要解决的问题是dfs,dfs的深入要与'yizhong'顺序一致,否则遍不符合题意,dfs不应只有4个方向,而是8个方向(通过X轴与Y轴的变化来实现)通过将窗口变为左坐标与右坐标,方便了窗口随循环变动的编写,将每次循环的窗口内的最大最小值放入数组中,因为左坐标正好与数组顺序一致,也不需要其他的代码。(本题有个测试点运行超时,只有90,但为了那个超时可能需要重编整段代码)
2025-01-14 20:31:51
233
原创 学习总结1.13
接水问题的核心是两个数组,一个是存放接水量,一个是水龙头,当所有水龙头都有相应的人时,通过比较找出最小的那个水龙头,然后将下一个接水量放入最小的水龙头数组中,然后继续进行下一轮比较,直到所有接水量都被存入后,找出水龙头数组里面最大的那个值,即接水所需总时间。将所有人放入一个数组中,每经过一次报数,便将对应的数组元素标记,下次经过时需要直接跳过即可,面对报的数大于剩余人数的情况,重置报数就可以了。明天将单词方阵的代码再写一下,dfs还是有点生疏,今天编了半天还有问题。
2025-01-13 19:37:14
203
原创 1.12学习总结
本题存在陷阱,不能简单地依靠左右括号数量来判断是否,如)(a+b)(这种情况,所以要有能确保括号能成对的代码,正常式子中括号都是左括号先出现,然后再出现右括号,即可以通过右括号数量是否大于左括号来判断式子是否非法。将日志看成一个栈,a栈为主栈,记录入库集装箱重量,b栈为辅助栈,记录对应的最大值。结果最后是有运行出错的部分,栈的知识还是不太熟练,需要继续学习。结果发现部分检查点运行超时,然后就使用栈的代码。一开始使用的暴力代码直接运行。如 a:1 2 3 5 4。弹出时,两栈同时弹出。
2025-01-12 20:56:12
243
原创 12.20学习总结
在dfs的时候,还是从左上角处开始,将聚在一起的0地块变为探索过的2地块,在完全探索完后,整个数组就变成了一个由0,1,2组成的数组了,此时剩下的0就是要计数的未被洪水淹没的地块。依然是使用dfs的一题,不过这次变成了字符,可能dfs的时候不好判断是否深度探索,很简单,在输入字符数组时,将0和*转换为熟悉的数字字符即可,并用另一个数组记录。(不是,这个bfs怎么离谱,原本还想着写个中山路,结果看不明白了,拼尽全力全力无法此时战胜)然后我也没东西写了,时间全花在弄清楚bfs上了。
2024-12-20 22:09:53
188
原创 12.19学习总结
在写了一个冒泡后,发现答案判错,原因就是下面提示所说的相同数之间的交换,但是仅仅一条a[j]==a[j+1]不足以判断。此时可以就靠最基础的冒泡排序编程并计数,在此轮循环后,而外增加一个循环计算重复书之间的计数关系。(今天写别的作业去了,编程就挑了两道相对有意义点的题,明天一定会多写点)这道题找规律找了半天,本质还是递归。
2024-12-19 22:27:56
153
原创 12.18学习总结
差分数组可以大大降低整个循环的运行压力,原本需要对原数组的(y-x)个元素进行加z的操作,而差分数组只需在a[x]与a[y+1]进行赋值。在处理完差分数组后,将dif[i]变为dif[i]+dif[i-1],此时差分数组就变回了原数组,之后再寻找最小值即可。装换后得到a[i][j]=dif[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1]同样是差分,只不过这次变成了二维(这里用一下其他人写的图)此处需要运用到差分的知识,如图。
2024-12-18 21:59:41
301
原创 12.17学习总结
本题是一道可以被逻辑优化的题,第一次写的时候被判错了,由于该题只需要判断奇偶性,因此无论a^b的结果只有奇偶之分,987654321与1一样都是奇数,987654320与0一样都是偶数,因此只需要每次运算的末尾即可,处理大数据问题时,也可以学着化繁为简。这个东西琢磨半天了,还有很多没太懂,还是留在明天写吧(一不小心挑了一块硬骨头啃)此行代码将i之前的数组元素全部加起来,放进一个数组里面,这个数组即前缀和。由于原范围涵盖太广,不能使用双层for循环,此时便可以使用前缀和。使用前缀和便可解决超时问题。
2024-12-17 22:51:37
171
原创 12.16学习总结
这道题可以用dfs的方法解题,初看想法是以其中一个0为起点,进行dfs,遇到1时回溯,直到深搜完这一区域的0地块,但是将被1包围区域的0却不好变成2,于是便可使用从外围深搜的方法,将被1挡在外面的0区块进行赋值为3(与1和2作区分),之后在遍历一次方阵,将等于3的点变为0,将等于0的点变为2,将思路逆转过来。但是有一点要注意,如图,图例为原例子,题目中明确提出只有被1围住的0区块才能被赋值为2,如果在边界没有1封口,按题意来说便是不算被1围住 (外围加粗的0为边界)
2024-12-16 21:59:33
379
原创 12.15学习总结
例如,123放在a[0]中,456放在a[1]中等等,统计共有多少个整数 ,并输出这些数。用一个if-else语句处理字符串数组与非字符串数组,但是如果对else处不做任何要求,便会将位于首位的第一个非数字字符和后续几个非数字字符变为0,并储存入num里,此时便再引用一个inNumber变量来判断。dfs时的判断条件便是当前地块是否为'0',且地块位置在定义的数组范围内,如若为0,则返回函数,如若不为0,则将此处改写为0,并根据下上右左的顺序深度探索地块,使得与其相连的地块被读取(归0)
2024-12-15 22:04:44
404
原创 12.13学习总结
这里的dfs包括了启程与回溯,对最长路径的判断,当路途走到尽头(即if条件不成立时),将此次路程的长度计入程序,然后最后的一次dfs(i)便完成了他的使命,走向下一串代码vis[i]=0,然后变开始了回溯。私以为dfs就是通过一次次地深入与回溯,不重复地取得相关的数据,其中的核心便是dfs函数的编写,以本题为例,本题通过以任意一处景点开始,走一条不重复经过景点的路线,并尝试找出其中最长的一条,以原题的例子。明天题目截止之前再去写写题单里的一两道题,这个dfs的思想还是有很多推敲的空间的,
2024-12-13 22:13:27
397
原创 12.12学习总结
票数的大小可以直观的体现在字符串的长度上,字符串越长,票数一定就越大,接下来就只需要解决同位数的字符串大小,正好strcmp可以比较字符串的大小,问题核心就解决了。判断芒果数的代码核心就是冒泡排序,但想要整行整行地换需要引入一个新的for循环,剩下的就是试错和优化代码了。第一想法就是计算每位字符的大小后,储存最大票数并输出,但是本质上还是回到了及计算票数大小的问题上。今天选修课考试花了一些时间,就写了几道排序题,巩固一下排序的知识。这题初看很简单,但是题目有额外的要求,即将票数当做字符串。
2024-12-12 22:39:53
208
原创 学习总结12.11
接下来要考虑的就是进位的问题,循环内仅需遍历各位到最高位的前一位,计算出前一位的差后,得到操作数,便视为加上那些数实现当前位数的进位,哪怕当前位数字是9,加1后变成了10也是没问题的循环的下一轮result+=10-('10'-'0'),相当于没加,被前一位进的1也进成10了。通过一次次的将数组的元素提前并调用,放回并执行(1 2 3中将1提前,2和3全排列,然后2提前,1和3全排列,3提前,1和2全排列)同时还要注意数字字符的顺序(如3提前后,1和2的顺序不能弄反)(剩下的还要继续学)
2024-12-11 22:22:56
197
原创 学习总结12.10
原式=a1*a2+a1*a3+...+a1*a5+...+a2*a3+...+a4*a5=a5*(a1+a2+a3+a4)+a4*(a1+a2+a3)+...+a2*a1。如何使计算过一次的组合,即‘1’与后续的‘0’重新组成‘10’不与前面的‘01’重复计算,仅需计数的i额外增加一次,跳过后续的‘10’即可。这道题的核心在于寻找‘10’与‘01’且不重复计算,开始编写的程序没有注意这个问题,导致输出有问题。括号外的元素序号递减,括号内总和减少,便得到下列程序。这道题初看还好,但第一次程序直接运行错误。
2024-12-10 21:59:34
242
原创 学习总结12.9
两种写法都是为了持续输入直到文件结束,效率上没有太大区别,while(~scanf("%d",&n))使用按位取反操作符~来检查scanf的返回值,但因为scanf返回的EOF是-1,~(-1)的结果为0.因为无论奇偶,前半部分的字符反转程序是一致的,但第二次for循环的i=len/2+len%2同时将奇偶的情况放在一起,不失为一种巧妙,末尾的统一输出也避免了多次运行输出出错的情况。=EOF)与while(~scanf("%d",&n))
2024-12-09 23:01:28
371
原创 学习总结12.8
类似于桶排,埃氏筛可以短时间内处理数据,首先定义一个数组num[100000],并将其中的所有元素设为1,以2为起点,将其所有为2的倍数的序号赋值为0,一轮循环过后开始将为3倍数的序号赋值为0,以此类推。此时a字符串与b字符串被放进原str字符串中,并且避免了原来str内元素任然存在的问题。双层for循环大大拉长了代码运行的时间,而埃氏筛可以解决这一问题。输入一个正整数n,输出在(1,n]的所有素数。一个快速将数组部分元素统一赋值的函数。此时str数组的10个元素被设置0。
2024-12-08 23:02:51
240
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅