数据结构&算法
文章平均质量分 66
1
STATICHIT静砸
你所见及我
展开
-
数据结构与算法之美读书笔记10
冒泡排序、插入排序、选择排序、快速排序、归并排序、计数排序、基数排序、桶排序。原创 2022-08-30 09:20:41 · 87 阅读 · 0 评论 -
数据结构与算法之美读书笔记5
1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。...原创 2022-08-29 12:29:11 · 84 阅读 · 0 评论 -
数据结构与算法之美读书笔记9
1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。3.基本上,所有的递归问题都可以用递推公式来表示,比如。...原创 2022-08-29 14:55:13 · 144 阅读 · 0 评论 -
数据结构与算法之美读书笔记8
1.先进者先出,这就是典型的“队列”结构。2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。3.所以,和栈一样,队列也是一种操作受限的线性表。原创 2022-08-29 13:33:49 · 115 阅读 · 0 评论 -
数据结构与算法——跳表
跳表的空间复杂度分析并不难,如果一个链表有 n 个结点,如果每两个结点抽取出一个结点建立索引的话,那么第一级索引的结点数大约就是 n/2,第二级索引的结点数大约为 n/4,以此类推第 m 级索引的节点数大约为 n/(2^m),我们可以看出来这是一个等比数列。当然,因为我们举的这个例子数据量很小,所以效率提升的不是特别明显,如果数据量非常大的时候,我们多建立几层索引,效率提升的将会非常的明显,感兴趣的可以自己试一下,这里我们就不举例子了。前面我们已经讲过了,链表的查询的时间复杂度为 O(n),那跳表的呢?..转载 2022-08-04 20:44:06 · 177 阅读 · 0 评论 -
数据结构与算法之美读书笔记12
1.线性排序算法包括2.线性排序算法的时间复杂度为。3.此3种排序算法都不涉及元素之间的比较操作,是的排序算法。4.对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。原创 2022-08-31 14:13:25 · 159 阅读 · 0 评论 -
数据结构与算法之美读书笔记14
二分查找针对的是一个的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待,直到找到要查找的元素,或者区间被缩小为0。二分查找是一种非常高效的查找算法。假设数据大小是n,每次查找后数据都会缩小为原来的一半,也就是会除以2。最坏情况下,直到查找区间被缩小为空,才停止。这是一个等比数列。n/2k=1时,k的值就是总共缩小的次数。每一次缩小操作只涉及两个数据的大小比较,所以经过了k次区间缩小操作,。通过n/2k=1,可以求得k=log2n,所以。原创 2022-09-03 01:04:46 · 339 阅读 · 0 评论 -
数据结构与算法之美读书笔记6
如果我们引入“哨兵”节点,则不管链表是否为空,head指针都会指向这个“哨兵”节点。在节点a和节点b之间删除节点b,b是a的下一节点,p指针指向节点a:p—>next = p—>next—>next;“哨兵”节点不存储数据,无论链表是否为空,head指针都会指向它,作为链表的头结点始终存在。表示p节点的后继指针存储了p节点的下下个节点的。在节点a和节点b之间插入节点x,b是a的下一节点,,p指针指向节点a,则。从上面的情况可以看出,针对链表的插入、删除操作,需要对插入第一个节点和删除最后一个节点的。...原创 2022-08-29 12:50:07 · 233 阅读 · 0 评论 -
数据结构与算法之美读书笔记11
r)表示,给下标从p到r之间的数组排序。比较这两个元素A[i]和A[j],如果A[i]原创 2022-08-30 23:40:43 · 160 阅读 · 0 评论 -
数据结构与算法之美读书笔记7
如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。4、特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。...原创 2022-08-29 13:08:04 · 175 阅读 · 0 评论 -
数据结构与算法之美读书笔记13
导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。②如果要排序的数组比较大,那“三数取中”可能就不够用了,可能要“5数取中”或者“10数取中”。①从区间的首、中、尾分别取一个数,然后比较大小,取中间值作为分区点。3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,:每次从要排序的区间中,随机选择一个元素作为分区点。原创 2022-09-03 00:49:03 · 75 阅读 · 0 评论 -
数据结构与算法之美-读书笔记4
对于第二种情况,要进行删除操作必须找到前驱节点,单链表需要从头到尾进行遍历直到p->next = q,时间复杂度为O(n),而双向链表可以直接找到前驱节点,时间复杂度为O(1)。数组简单易用,在实现上使用连续的内存空间,可以借助CPU的缓冲机制预读数组中的数据,所以访问效率更高,而链表在内存中并不是连续存储,所以对CPU缓存不友好,没办法预读。2)对链表进行频繁的插入和删除操作,会导致频繁的内存申请和释放,容易造成内存碎片,如果是Java语言,还可能会造成频繁的GC(自动垃圾回收器)操作。...原创 2022-08-27 00:54:03 · 81 阅读 · 0 评论 -
数据结构与算法之美-读书笔记3
在面试的时候问到数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。实际上,这种表述是不准确的。数组是适合查找操作,但是查找的时间复杂度并不为O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是O(logn)。所以,正确的表述应该是,数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。根据下标随机访问的时间复杂度。...原创 2022-08-27 00:35:43 · 156 阅读 · 0 评论 -
数据结构与算法之美读书笔记15
与第一种类似,只需要检查后一个元素是否也等于目标值即可。检查后一个数是否大于指定值。}原创 2022-09-03 11:12:46 · 353 阅读 · 0 评论 -
回溯算法学习笔记
因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。✅一般而言递归函数都没有返回值。所有的回溯法都可以抽象为一个树形结构。(通常抽象为n叉树)✅回溯用于解决组合问题,切割问题,子集问题,排列问题,棋盘问题。书写时,一般不在一开始就定下参数,根据需要修改增加。递归一顶有终止点,到了终止点就会一层一层往上返回。树的宽度为处理集合的大小,深度为递归的深度。虽然回溯法很难,但是回溯法并不高效。✅ 递归函数的参数和返回值。原创 2022-08-23 13:28:47 · 149 阅读 · 0 评论 -
数据结构与算法之美-读书笔记1
以时间复杂度为例,由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,所以常量阶、低阶以及系数实际上对这种增长趋势不产决定性影响,所以在做时间复杂度分析时忽略这些项。算法的执行时间与每行代码的执行次数成正比,用T(n) = O(f(n))表示,其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n往往表示数据的规模。O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平。O(2^n)(指数阶)、O(n!原创 2022-08-22 13:50:15 · 122 阅读 · 0 评论 -
数据结构与算法之美-读书笔记2(时间复杂度详细分析)
O(1)是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有3行,它的时间复杂度也是O(1),而不是O(3)。当大于n时,循环结束。x=log2n,所以,这段代码的时间复杂度就是O(log2n)。不管是以2为底、以3为底,还是以10为底,所有对数阶的时间复杂度都记为O(logn)。在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为O(logn)。只要代码的执行时间不随n的增大而增长,这样代码的时间复杂度我们都记作O(1)。如果一段代码的时间复杂度是O(logn),原创 2022-08-22 00:45:38 · 347 阅读 · 0 评论 -
CF - Li Hua and Pattern
题意:给出了矩阵,里面每个位置分为蓝色或红色(数据上用1和0体现了),给出了一个操作次数,每次可以改变一个坐标的颜色,问能否通过操作使得图像旋转180度后不变。解:很容易想到,需要使该图像中心对称,应该对称相等的两个位置不相等时,就需要进行一次操作,把其中一个修改成另一个颜色,我在输入这个操作时就计算出了需要修改的次数。如果图像n*n的奇数长度的边,那么它最中间那个位置和它自己中心对称,无需考虑是什么颜色,那么不管还需要操作多少次都可以直接操作它消耗掉。但一开始忽略了很重要的一点,我没完全看明白的题意,原创 2023-04-26 22:20:36 · 449 阅读 · 0 评论 -
CF46B T-shirts from Sponsor
这道题我的思路是,先把尺码转为数字代表,然后每次从i=0到5的移动量先判断大i码是否有存量再判断小i码是否有存量,有就输出并减少库存跳出for循环,这样子就达到了既选择最接近的尺寸又在大小都有时优先选择偏大尺码的要求。最近事情比较多,做的题目都没时间写题解,会抽空都把题解补了。洛谷 CF46B T-shirts from Sponsor。原创 2022-10-15 12:42:14 · 273 阅读 · 0 评论 -
CF:Sort the Subarray
解法:很容易想到,两数组从两边往中间比较,首次出现不同的两端组成的子序列是最小目标子序列,但题目希望这个排序的子序列尽可能的长,所以我们只需要在这两端的基础上往两边遍历,如果左边往左遍历,小于端点且逐渐减小,那么这部分可以加入,右边同理,因为符合这个规则的话加上这两部分她们及时参与排序也并不需要进行位置的改变。题意: 第二个数组是由对第一数组的一个子序列排序后得到的,要求的是该子序列的最长是哪一段。原创 2023-04-26 21:50:51 · 114 阅读 · 0 评论 -
CF - Li Hua and Maze
而且判断第一个位置时如果它在角落那就不需要判断第二个位置了,因为最少需要堵两个位置,不会再少了,此时可以直接输出然后2进行下一轮判断。题意:题目给出一个矩阵,再给出两个位置(这两个位置不会直接相邻),求最少需要堵几个位置使得两位置之间无路可通。这道题给出的样例解释非常具有迷惑性,还特意画了一条通顶的路线堵住,其实总共只有那么三种情况,就是2,3,4个。对两个位置进行判断的方法是一样的,所以可以提取出来作为一个函数方法。当障碍靠边但不在角落时,只需要堵3个位置。当障碍在四个角上时,只需要堵2个位置。原创 2023-04-26 22:03:11 · 106 阅读 · 0 评论 -
CF- Yura‘s New Name
因为如果是_的话,它的左右两边必须是^^它才能合理存在,其中我们还要对结尾进行特判,因为我们无法遍历到最后位置的后一个位置,所以如果结尾是个_,那它后面必须加一个^;^_^和^^是想要的,题目让我们把输入的字符串,向里面添加 ^ 或者 _ 使得整个字符串都是这两部分组成的,问最少添加多少个字符。解:这道题我调试了挺多次,基本逻辑就是,遍历到一个字符时,判断它前面是_吗,根据这个和当前字符是什么来确定是否需要添加。在两端加上一个_,然后只需要在_和_之间加一个^即可,你别说,你还真别说,真妙啊。原创 2023-04-26 22:10:35 · 176 阅读 · 0 评论 -
CF - Tear It Apart
找出最大的相邻(理论上相邻,就是第一个a和第二个a,第二个a和第三个a之间的距离这个意思的相邻)该字母之间的字符个数。如果能把隔最远的两个相邻该字母靠近,那么其他的就一定能消除。当我们想要使得两个字符靠近,先要看她两之间隔着几个无关字符,假设隔了N个,那么由于每次删除的字符不能相邻(至少也要隔一个),所以最少通过log2(N)+1次来消除她们之间的无关字符。这里我们进行了一个转换,就是用一个二维数组的一维存储当前字符是谁(通过-'a'换成0~26数字),用它的二维(也就相当于每一行)存储该字母出现的下标。原创 2023-04-26 22:31:05 · 165 阅读 · 0 评论 -
CF - Playing in a Casino
因此,例如,如果总共有四个玩家,则进行六场比赛:第一场比赛对第二场比赛,第一场比赛对第三场比赛,第一场比赛对第四场比赛,第二场比赛对第三场比赛,第二场比赛对第四场比赛,第三场比赛对第四场比赛。,这里的i指的是1~n,n最大3e5,a【i】【j】最大1e6,一相乘就变成了3e11,所以必须用long long int,而vector中的数值也需要用long long int,对范围做判断即可,不做再多解释了。(注意由于进行了行列转换,这里的一维要用m,二维用n)回到前面,如果n>1,接下来要对每列进行排序。原创 2023-04-26 22:55:31 · 493 阅读 · 0 评论 -
CF - Lucky Numbers
可以发现,每遍历100个数必然会出现一个存在9和0的组合的数,而两个个位数相减最大结果就是9,所以遍历时计算出幸运值9时候就无需继续遍历了。这道题相对来说就很简单了,注意数值限制范围在1道1e6,虽然这道题确实暴力就能做出来,但也需要进行剪枝避免浪费时间多余的操作。题意:一个数的幸运值计算规则是用里面最大的数字-最小的数字所得值 给出一个范围,求这个范围里幸运值最大的是哪个数。思路也很简单,就是把该数字拆成一位一位过程中找到最大值和最小值,返回它们之差。我们不能进行单纯的遍历计算比较,会时间超限的。原创 2023-04-26 23:02:29 · 309 阅读 · 0 评论 -
CF1200E Compress Words
题目描述Amugae has a sentence consisting ofnnwords. He want to compress this sentence into one word. Amugae doesn't like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix ...原创 2022-02-11 17:25:24 · 425 阅读 · 0 评论 -
归并排序针对性刷题
main:归并排序原创 2022-07-19 17:18:05 · 211 阅读 · 0 评论 -
【刷题题解】编辑距离
这道题的dp【i】【j】含义我们设定为:word1的前 i 字符串转变为word2的前 j 字符串所需要进行的最小操作数。=word【j】时,我们有三种操作选择,增加/删除/替换;,即从空字符串变成另一个字符串或者从一个字符串变为空,转换所需的操作数即为另一个单词的长度。这道题也是,一眼动态规划,乍一看感觉很复杂,仔细思考一下还是觉得很复杂。中的一个为空时,转换所需的操作数即为另一个单词的长度。逐一遍历word1的每个字符上遍历word2的每个字符。当word【i】=word【j】时,无需做改变。原创 2024-02-04 23:49:55 · 273 阅读 · 0 评论 -
本周刷题记录
而第一个数,i=1,所以第一个数可以随意取,那么其他位置上的数我们只需要取i本身就行(相当于取了i的1倍,符合要求),那么第一个数取多少取决于该条件。因为只有两种操作,即删除最小的两个数或者删除最大的一个数,这样的题目我们很容易想到先进行一个sort排序,那么删除哪个数也就是维护两端端点就行了。很容易发现,我们只需要遍历整个序列一共有多少个0,假设是n个0,那么再遍历前n个数,遇到1则ans加1,相当于用前n个里的1去消除掉后面的0。序列只由0或1组成,我们可以进行的操作是,删除一个数加到另一个数上面去。原创 2023-05-17 20:06:37 · 478 阅读 · 0 评论 -
【刷题日记】最长递增子序列的个数
如果 dp【i】< dp【j】+1,我们需要更新dp【i】=dp【j】+1,同时,cnt【i】=j的最长子序列个数即cnt【j】。如果dp【i】= dp【j】+1,说明两种情况长度相同,要把cnt【j】也加到cnt【i】中。同时,如果res = dp【i】,说明这两种情况长度一样,要把cnt【i】也加到ans中。思路:这道题和上一道题的本质是一样的,只是在迭代结果时要做一些更细致的操作。上一题我们要取dp【i】和dp【j】+1中更大的。还需要增加一个记录结果个数值的变量ans。返回最长递增子序列的个数。原创 2024-02-06 15:52:19 · 216 阅读 · 0 评论 -
【刷题日记】最长数对链
当pairs【i】【0】>pairs【j】【1】时,dp【i】=max(dp【i】,dp【j】+1);思路 :这道题其实,还是和前一个很像,只不过是数组对找最长递增序列的感觉。然后dp【i】含义设置为以pairs【i】【1】为结尾的最长递增序列长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。- 如果返回值 等于 0,则`a`和`b`的相对位置不变。- 如果返回值 小于 0,则将`a`排在`b`之前。- 如果返回值 大于 0,则将`b`排在`a`之前。个数对组成的数对数组。原创 2024-02-06 16:15:33 · 278 阅读 · 0 评论 -
【刷题题解】最长回文子序列
给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列这道题,一眼动态规划,但是即使动起来也规划不了一点😅好,这道题,我们可以这样子思考,先把视线聚焦在单个字符上,单个字符是s【i】就是一个回文字符串,所以,在此基础上,原创 2024-02-04 22:52:40 · 313 阅读 · 0 评论 -
【刷题日记】最长递增子序列
给你一个整数数组 ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, 是数组 的子序列。这道题比较简单。只需要用到一维的dp数组。首先dp【i】的含义设定为数组中 0 到 i 项中最长递增子序列的长度初始化时,每个数字本身单独就是一个递增子序列,所以初始化dp值为1递推公示:从前往后推,遍历nums数组,然后在当前数组项的基础上遍历前面的数组项。当nums【i】>nums【j】时才可能产生更长的递增子序列,在dp【j】的基础上加原创 2024-02-06 15:36:49 · 182 阅读 · 0 评论 -
CSS刷题错题记录
每天做几个题,顺便记录错题原创 2022-12-27 22:55:25 · 100 阅读 · 0 评论 -
刷题日记-139. 单词拆分
如果找到了一个拆分点 `j`,且 `dp[j]` 为 `true`,表示从起始位置到 `j` 的子字符串可以被拆分为字典中的单词,那么将 `dp[i]` 设置为 `true`。最后,如果 `dp[s.size()]` 为 `true`,表示整个字符串 `s` 可以被拆分为字典中的单词,返回 `true`;否则返回 `false`。这段代码是一个解决单词拆分问题的函数 `wordBreak`,其作用是判断字符串 `s` 是否可以被拆分为由字典 `wordDict` 中的单词组成。在每个拆分点 `j` 处,原创 2024-01-21 10:02:30 · 436 阅读 · 0 评论 -
【刷题日记】最长定差子序列
更新哈希表,这里 `dp.get(v - difference) || 0` 是获取以 `v-difference` 结尾的最长等差子序列的长度,如果不存在则返回0,然后加1表示将当前元素 `v` 加入到等差子序列中。在这个问题中,状态转移方程是 `dp[v] = dp[v-d] + 1`,意味着如果存在一个值为 `v-d` 的元素,那么以值为 `v` 的元素结尾的最长等差子序列的长度可以从以 `v-d` 结尾的最长等差子序列的长度推导出来,即在后者基础上加一。` 更新找到的最长等差子序列的长度。原创 2024-02-06 17:07:47 · 757 阅读 · 0 评论 -
【刷题日记】最长等差数列
等差数列的特点是相邻两个数的差值是一致的。该题数组中的每个元素值大小范围是【0~500】,所以等差数列的差值范围是【-500~+500】,我们计算差值时可以把差值+500使得差值范围变成【0~1000】;注意,那要把dp数组大小改到1000+.初始化:每单独一个数字都可以是任意等差数的等差数列的唯一成员,所以初始化dp的值为1。dp【i】【j】的含义是:以第i个值为最后一个元素,以j为差值的等差数列的长度。这道题,只要思路想到了就很好写。) 的值都相同,那么序列。按照这个思路可以解题。原创 2024-02-17 01:51:27 · 255 阅读 · 0 评论 -
栈和队列容器
对应头文件#include <stack>#include <queue>如何定义一个栈或队列queue<数据类型> 队列名称;stack<数据类型> 栈名称;//数据类型可以是int,char,string,或者结构体。相关功能函数栈:empty size back push_back pop_back队列:empty size front back push_back pop_front.原创 2022-03-14 13:39:11 · 959 阅读 · 0 评论 -
2022.2.16(最小生成树)
c++中sort的重载文件操作在vs2019中遇到了困难(想办法ing)做题⬇⬇⬇原创 2022-02-16 23:12:08 · 784 阅读 · 0 评论 -
2022.2.15(kruskal,prim)
今天不太舒服☹补题 P4779 【模板】单源最短路径(标准版) 学习生成最小树(还没学会。)【C语言描述】《数据结构和算法》_哔哩哔哩_bilibili原创 2022-02-15 20:18:58 · 272 阅读 · 0 评论