![](https://img-blog.csdnimg.cn/direct/fb58b59471aa440db459fc22bb0317e6.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习笔记
文章平均质量分 71
记录算法模板,笔记,对应的例题
喝可乐的布偶猫
热爱生活 热爱编程
展开
-
第十二届蓝桥杯C/C++ B组 杨辉三角形(二分查找+思维)
3、无论横着按行去看还是竖着按列去看,还是斜行去看都是最里面的数是大的,也就是2, 6,20这一列是大的,所以也就是越靠下的斜行,数越大,所以我们再找N的时候,就 要 从下去开始找,这也是为什么后面在代码部分会从后往前去遍历。当为C(4,2) == 6时,r = 4,k = 2,它的前面有4行,前面4行的总个数为1 + 2 + 3 + 4= 10,也就是 (r + 1) * r / 2,再加上它在这行的位置k + 1。欢迎不会的小伙伴留言~原创 2024-04-22 08:00:00 · 1208 阅读 · 0 评论 -
八数码(bfs做法)非常详细,适合新手服用
那么就需要用上面我们说的状态转换,先把一个字符串转换成3*3的矩阵,利用枚举当前x能移动的上下左右四个点,就可以做出变换,然后再变回字符串。此图来源于acwing题解中的一位大佬所画,由于每个边的权值是1(也就是距离),所以我们可以利用宽搜天生就带有性质,求出最短的路径。,哈希表去存储当前字符串下的距离值是多少,然后通过最终我们想要的字符串和变换中的字符串进行比较,最后输出距离。现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。在一个 3×3 的网格中,1∼8这 8 个数字和一个。原创 2024-04-04 21:30:06 · 469 阅读 · 0 评论 -
食物链(并查集) 维护权值写法,非常详细,适合新手服用
再比如:x吃y, y吃z,通过上面我们画的有向图,是不是也能推出来z吃x呢。这里推荐大家手动模拟一遍,然后看一下两者的区别,第一种只能去求出到父亲节点的距离,并不能够达到累加求到根节点的距离,相比之下,第二种可以。此人对 N个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。以下 K 行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。所以我们只需要知道两个动物的关系,放到集合中,集合中所有动物的关系,我们是一定可以退出来的。原创 2024-04-02 21:21:01 · 1338 阅读 · 0 评论 -
P5731 【深基5.习6】蛇形方阵
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。输入一个正整数 n,含义如题所述。输出符合题目要求的蛇形矩阵。数据保证,1≤n≤9。原创 2024-03-31 22:41:36 · 236 阅读 · 0 评论 -
走迷宫(BFS两种写法)
这里有一个知识点就是如何能方便上下左右去走,这个时候就要设置一个上下左右的偏移量,设中间数是(x,y)往上走一个单位就是(x-1,y),往右走一个单位就是(x,y+1),往下走一个单位就是(x+1,y),往左走一个单位是(x,y-1);最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。第四层是(2,2),(4,0),第五层是(1,2)和 (4,1) 和(2,3)第一层是(1,0),接着第二层是(2,0),第三层是(2,1)和(3,0)第六层是(0,2).。原创 2024-03-28 19:18:23 · 619 阅读 · 0 评论 -
n-皇后问题(DFS深搜两种解法)
那么就第四行,(4,1)这个点和(1,1)冲突,(4,2)和(3,2)冲突,(4,3)和(3,2)冲突,因为在捺对角线上,都不行就回到上一个空间,按照上一个空间皇后的位置接着往后挪,以此类推,这里就不再赘述。接着枚举第三行,第一个位置同理不可以,第二个位置(3,2),与(2,3)在同一个撇对角线上不行,接着走(3,4),不可以与(2,3)冲突。我们去按行枚举,也是按照下图(是一个4*4的棋盘)解释,比如我们第一个肯定是先走(1,1)这块,继续接着走,走到(2,2)这个位置,也不可以,在捺对角线上,原创 2024-03-27 15:11:23 · 1502 阅读 · 0 评论 -
字符串哈希(c++)
字符串哈希把不同的字符串映射成不同的整数。原创 2024-03-23 23:19:53 · 440 阅读 · 0 评论 -
哈希表(c++)
哈希表,也称为散列表,是一种非常高效的数据结构。它通过将键(Key)映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数(Hash Function)完成,该函数将键转化为一个整数,该整数用作数组的下标。原创 2024-03-23 21:02:59 · 503 阅读 · 0 评论 -
模拟堆(详解+例题)
维护一个数据集合,堆是一个完全二叉树。那么什么是二叉树呢?原创 2024-03-21 20:25:21 · 961 阅读 · 0 评论 -
P1303 A*B Problem(高精度乘法)
【代码】P1303 A*B Problem(高精度乘法)原创 2024-03-17 18:22:32 · 356 阅读 · 0 评论 -
并查集(详解+例题)
问题3:如何合并两个集合:p[x]是x的集合编号,p[y]是y的集合编号。询问两个元素是否在一个集合中。每个集合用一颗树表示。(这里会优化后面,通过。原创 2024-03-17 17:52:08 · 828 阅读 · 0 评论 -
Trie树(详解+例题)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,每个节点保存一个字符,一条路径表示一个字符串。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。原创 2024-03-16 00:20:14 · 1757 阅读 · 0 评论 -
KMP字符串(解释+例题)
i = 3的时候 j = 0 ,p[i] == p[j+1], p[i] = "a" ,p[j+1] = "a",j往后挪动一位所以next[3] = 1;= p[j+1], p[i] = "b" ,p[j+1] = "a",j不动所以next[2] = 0;i = 4的时候 j = 1 ,p[i] == p[j+1], p[i] = "b" ,p[j+1] = "b",....next[4] = 2;4> 如果j==n,匹配成功,然后继续匹配完字符串,使其j=ne[j],直至s串循环完为止。原创 2024-03-13 15:16:46 · 1020 阅读 · 0 评论 -
单调队列(例题)
在示例中,我们从数组中第一个元素开始遍历,由于窗口的大小是3,因此当遍历到第三个元素时,窗口就形成了。之后,继续遍历元素时,为了保持窗口的大小为3,左侧元素就需要从窗口中剔除。这样使得窗口一直在向右移动,直到考察到最后一个元素结束,这就是所谓的滑动窗口。此图借大佬图。原创 2024-03-10 10:58:31 · 469 阅读 · 0 评论 -
单调栈(例题+解析)
例如:数组a[i] = 3 4 2 7 5答案: -1 3 -1 2 2。原创 2024-03-08 23:21:44 · 521 阅读 · 0 评论 -
表达式求值(中序遍历,双栈实现)
由于我们”假设“,存在的这棵树根节点的运算符优先级最低,所以这颗树从底部往上走,运算符的优先级就越低,所以当我们遇到当前运算符的优先级。另外因为括号无视优先级,需要优先计算括号内的数,那么我们在遇到‘)’时可以直接将栈内的数从后向前计算出来。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。我的理解就是,本题采用去用一棵树的中序遍历去模拟此题,然后去用双栈实现。我们发现,想要计算某个结点的运算符,必要条件是左右子树都已经计算完。如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈。原创 2024-03-05 23:19:47 · 1510 阅读 · 1 评论 -
模拟队列(数组实现)
【代码】模拟队列(数组实现)原创 2024-03-02 22:00:00 · 415 阅读 · 1 评论 -
模拟栈(数组实现)
【代码】模拟栈(数组实现)原创 2024-03-02 16:47:15 · 429 阅读 · 0 评论 -
acwing算法学习笔记 ------ 双链表
这里可以做一个投机取巧,我们不再像单链表去用head去存头和尾,直接让r[0] = 1,l[1] = 0;idx = 2.进行初始化,解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标, r[N]:表示指向下一个节点的下标。大家不用担心idx会乱什么的,只要指向咱们做的对,那就没问题,idx就相当于一个小房子,给节点分担住处的。原创 2024-02-24 14:14:22 · 729 阅读 · 0 评论 -
C++ 区间合并 算法(详解) + 例题
把所有,有交集的区间合并图解: 3、例题:803. 区间合并 - AcWing题库 输入格式 输出格式 数据范围 输入样例: 输出样例: 图解: 第二种:原创 2024-02-19 14:18:12 · 1491 阅读 · 4 评论 -
C++ 离散化 算法 (详解)+ 例题
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的压缩。例如:值域:1~10^9, 个数:10^5,值域很大,但是用到个数相对很少,这个时候就可以离散化。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。注意:对于上述第三条,可以理解为去找这个数映射后的数组下标。假定有一个无限长的数轴,数轴上每个坐标上的数都是 00。共 m行,每行输出一个询问中所求的区间内数字和。原创 2024-02-18 17:53:20 · 3641 阅读 · 0 评论 -
一维差分,二维差分(详解+例题)
我们想要是只让小黑方块里加C即可,其他位置不变,那么我们就需要类比一维差分让画虚线的部分减c,下面是黑阴影面积,右面是紫色阴影面积,所以我们要让(紫色阴影面积部分)b [x1] [y2+1] += c, 和 (黑色阴影面积)b [x2+1] [y1] += c, 然后我们可以发现重叠的部分多加了一次C,所以我们再让重叠部分减去C即可,(重叠部分)b [x2+1] [y2+1] += c,用来抵消,这样正好其他的地方都不会发生变化。我们只需要让差分数组b中,区间[l,r]中的所有值都加上常数C,原创 2024-02-05 21:18:23 · 2828 阅读 · 0 评论 -
一维前缀和、二维前缀和(详细解释+例题+代码)
s[i] = s[i-1] + a[i] ,随意对应前缀和矩阵下(1,3)方格坐标下,s[1,3] = s[1,2] + a[1,3];1≤n,m≤1000 1≤q≤200000 1≤x1≤x2≤n 1≤y1≤y2≤m −1000≤矩阵内元素的值≤1000−1000≤矩阵内元素的值≤1000。输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2表示一个子矩阵的左上角坐标和右下角坐标。接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。原创 2024-02-04 10:30:55 · 1200 阅读 · 0 评论 -
双指针算法+例题
双指针算法,实质上是把朴素算法O(n^2),发现一些性质,转换成 O(N)时间复杂度。给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。第二行包含 n 个整数(均在 0∼10^5范围内),表示整数序列。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。第一行包含整数 n。原创 2024-02-17 21:50:26 · 460 阅读 · 0 评论