随笔分类 -  算法学习记录

摘要:一、算法描述 本篇文章水平不够,讲不清楚KMP到底是怎么回事,以后再更新一下。 本篇文章讲述的是KMP算法, 一个著名的字符串匹配算法,效率很高,\(O(n)\) 的时间复杂度。 难点在于:如何理解 \(next[i]\) ★★★ \(ne[i] = j\) 表示,\(p[1 ~ j] = p[i 阅读全文
posted @ 2023-11-30 12:30 grave-master 阅读(65) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是单调队列,主要用于解决 滑动窗口 类问题的数据结构,即,在长度为 \(n\) 的序列中,求每个长度为 \(m\) 的区间的区间最值,时间复杂度 \(O(n)\)。 思路如下: 用一个队列 \(q[N]\) 来存储可能是答案的下标。 先判断是否滑出了窗口,如果滑出 阅读全文
posted @ 2023-11-29 20:24 grave-master 阅读(64) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是单调栈,是一种和单调队列类似的数据结构(下一篇文章会讲到)。 单调队列主要用于 \(O(n)\) 解决滑动窗口问题,单调栈主要用于 \(O(n)\) 解决 NGE问题 (Next Greater Element),也就是对序列中的每个元素,找到上(下)一个比它大 阅读全文
posted @ 2023-11-29 19:24 grave-master 阅读(62) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是,队列,数组模拟队列,也不是循环队列。 队列的结构,完全就是学校食堂排队打饭的那个队列。一个队头,一个队尾,从队头出,从队尾进,排队打饭也是这样hhh。 //用数组模拟的队列定义如下: int hh, tt; int q[N]; /* hh表示队头,tt表示队尾 阅读全文
posted @ 2023-11-27 15:06 grave-master 阅读(63) 评论(0) 推荐(0)
摘要:一、题目来源 AcWing算法基础课-3302.表达式求值 二、题目描述 给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。 注意: 数据保证给定的表达式合法。 题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)* 阅读全文
posted @ 2023-11-27 13:51 grave-master 阅读(174) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是,栈,数组模拟栈。 栈的结构相信大家应该很清楚了,特点就是先进后出,只能在栈顶操作,栈底不能操作。 //用数组模拟的栈定义如下: int tt; int st[N]; /* tt表示栈顶(我习惯于表示栈顶的下一个位置,可以根据个人习惯来修改) st[N]表示栈 阅读全文
posted @ 2023-11-26 23:01 grave-master 阅读(58) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是双链表,与上一篇文章一样是算法竞赛中常用的用数组模拟的双链表。 //用数组模拟的双链表定义如下: int e[N], l[N], r[N], idx; /* e[i]表示节点i的值 l[i]表示节点i的左边一个节点 r[i]表示节点i的右边一个节点 idx表示当 阅读全文
posted @ 2023-11-26 15:19 grave-master 阅读(72) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章讲述的数据结构是单链表,当然不是常规的单链表,而是算法竞赛中常用的用数组模拟的单链表。 //常规的单链表定义如下: struct { int val; Node *next; } //用数组模拟的单链表定义如下: int head; int e[N], ne[N], idx; 阅读全文
posted @ 2023-11-25 23:09 grave-master 阅读(44) 评论(0) 推荐(0)
摘要:一、题目来源 AcWing算法基础课-803.区间合并 二、题目描述 给定 \(n\) 个区间 \([l_i,r_i]\),要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:\([1,3]\) 和 \([2,6]\) 可以合并为一个区间 \([1,6] 阅读全文
posted @ 2023-11-22 18:31 grave-master 阅读(108) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章介绍离散化。 什么是离散化? 对于一个数组 \(a\) 来说,他是升序的,其中数字范围很大,例如 \(-10^9\)~\(10^9\)。 但是,数字的个数很少,只有 \(0\)~\(10^5\)。 那么这种情况下就没有必要将数组开得很大从而导致浪费空间,而只需要将每一个数字进行 阅读全文
posted @ 2023-11-22 15:07 grave-master 阅读(104) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章介绍位运算,直接从用法方面来介绍。 求第 K 位 将第 \(k\) 位移到最后面。 &1 即可。 所以操作为:n >> k & 1 求最后一个 1(求 1 的个数) \(x\) = \(1010...100...0\) ~\(x\) = \(0101...011...1\) ~ 阅读全文
posted @ 2023-11-22 14:01 grave-master 阅读(108) 评论(0) 推荐(0)
摘要:一、题目来源 AcWing算法基础课-2816.判断子序列 二、题目描述 给定一个长度为 \(n\) 的整数序列 \(a_1,a_2,…,a_n\) 以及一个长度为 \(m\) 的整数序列 \(b_1,b_2,…,b_m\)。 请你判断 \(a\) 序列是否为 \(b\) 序列的子序列。 子序列指序 阅读全文
posted @ 2023-11-22 09:04 grave-master 阅读(145) 评论(0) 推荐(0)
摘要:一、题目来源 AcWing算法基础课-800.数组元素的目标和 二、题目描述 给定两个升序排序的有序数组 \(A\) 和 \(B\),以及一个目标值 \(x\)。 数组下标从 \(0\) 开始。 请你求出满足 \(A[i] + B[j] = x\) 的数对 \((i,j)\)。 数据保证有唯一解。 阅读全文
posted @ 2023-11-21 23:00 grave-master 阅读(77) 评论(0) 推荐(0)
摘要:一、算法描述 含义 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。 另外还可以根据序列进行区分,例如在快排中,双指针指向的是同一个序列,而归并排序中两个指针指向的是两个不同的序列。 怎么用 阅读全文
posted @ 2023-11-21 21:12 grave-master 阅读(237) 评论(0) 推荐(0)
摘要:往昔少年时 家中长者常劝诫以万般皆下品,唯有读书高 然懵懂之辈实践浅薄,常怀不识之念 胸无点墨又不耐寒窗苦读 见手不释卷,胸有锦绣者,常羡而慕之,乃效仿,却难得其中三昧 于是叹曰,非吾之过,此天赋使然也 遂沉湎与虚无缥缈之梦,蹉跎岁月,虚度年华 今时今日,每念及此,常追悔莫名 人皆恰同学少年,风华正 阅读全文
posted @ 2023-10-25 17:37 grave-master 阅读(450) 评论(0) 推荐(2)
摘要:一、算法描述 上一篇文章介绍了一维差分,本篇文章来介绍一下什么是二维差分。 含义 显然一维差分是一维前缀和的原数组,那么二维差分就是二维前缀和的原数组。 怎么求 跟一维一样,插入一遍即可,但是要注意每次插入要在同一个位置内插入,insert(i, j, i, j, a[i][j]);。 怎么用 一维 阅读全文
posted @ 2023-10-20 19:05 grave-master 阅读(1765) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章介绍前缀和的逆运算,差分。 什么是差分? 差分是前缀和的逆运算,比如 \(a[n]\) 是原数组,\(s[n]\) 是 \(a[n]\) 的前缀和数组,那么对于 \(s[n]\) 来说,\(a[n]\) 就是 \(s[n]\) 的差分数组。 假设原数组为 \(a[n]\) , 阅读全文
posted @ 2023-10-19 21:18 grave-master 阅读(418) 评论(0) 推荐(0)
摘要:一、算法描述 上一篇文章介绍了一维前缀和,也就是一个数组的前n项和,这篇文章来介绍一下什么是二维前缀和。 含义 一维的是前n项的和,那么二维的情况下,表示的则是与左上角形成的矩形和。 怎么求 一维的递推关系式是s[i] = s[i - 1] + a[i];,我们根据含义来思考二维的递推关系式,读者可 阅读全文
posted @ 2023-10-18 21:02 grave-master 阅读(319) 评论(0) 推荐(0)
摘要:一、算法描述 本篇文章我们来介绍一个简单的算法,前缀和。 什么是前缀和? 前缀和是某一个序列的前n项的和,可以理解为数学上的数列的前n项和。 如果 \(a\) 和 \(s\) 分别是原数组和前缀和数组,那么应该有如下关系: s[1] = a[1];、s[2] = a[1] + a[2];、s[3] 阅读全文
posted @ 2023-10-17 11:23 grave-master 阅读(195) 评论(0) 推荐(0)
摘要:一、算法描述 高精度除法和乘法讨论的一样,都是一个大整数和一个小整数之间的运算。 算法思路 根据小学除法一样,我们还是模拟这个过程。 注意这里遍历\(A\)数组的时候要按照我们读数字的顺序,也就是从数组尾部到头部遍历。 每一位的计算过程应该是,上一轮的余数\(r\)乘\(10\)之后加上当前位数上的 阅读全文
posted @ 2023-10-16 21:04 grave-master 阅读(158) 评论(0) 推荐(0)