11 2023 档案
摘要:一、算法描述 本篇文章水平不够,讲不清楚KMP到底是怎么回事,以后再更新一下。 本篇文章讲述的是KMP算法, 一个著名的字符串匹配算法,效率很高, 的时间复杂度。 难点在于:如何理解 ★★★ 表示,\(p[1 ~ j] = p[i
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是单调队列,主要用于解决 滑动窗口 类问题的数据结构,即,在长度为 的序列中,求每个长度为 的区间的区间最值,时间复杂度 。 思路如下: 用一个队列 来存储可能是答案的下标。 先判断是否滑出了窗口,如果滑出
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是单调栈,是一种和单调队列类似的数据结构(下一篇文章会讲到)。 单调队列主要用于 解决滑动窗口问题,单调栈主要用于 解决 NGE问题 (Next Greater Element),也就是对序列中的每个元素,找到上(下)一个比它大
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是,队列,数组模拟队列,也不是循环队列。 队列的结构,完全就是学校食堂排队打饭的那个队列。一个队头,一个队尾,从队头出,从队尾进,排队打饭也是这样hhh。 //用数组模拟的队列定义如下: int hh, tt; int q[N]; /* hh表示队头,tt表示队尾
阅读全文
摘要:一、题目来源 AcWing算法基础课-3302.表达式求值 二、题目描述 给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。 注意: 数据保证给定的表达式合法。 题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是,栈,数组模拟栈。 栈的结构相信大家应该很清楚了,特点就是先进后出,只能在栈顶操作,栈底不能操作。 //用数组模拟的栈定义如下: int tt; int st[N]; /* tt表示栈顶(我习惯于表示栈顶的下一个位置,可以根据个人习惯来修改) st[N]表示栈
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是双链表,与上一篇文章一样是算法竞赛中常用的用数组模拟的双链表。 //用数组模拟的双链表定义如下: int e[N], l[N], r[N], idx; /* e[i]表示节点i的值 l[i]表示节点i的左边一个节点 r[i]表示节点i的右边一个节点 idx表示当
阅读全文
摘要:一、算法描述 本篇文章讲述的数据结构是单链表,当然不是常规的单链表,而是算法竞赛中常用的用数组模拟的单链表。 //常规的单链表定义如下: struct { int val; Node *next; } //用数组模拟的单链表定义如下: int head; int e[N], ne[N], idx;
阅读全文
摘要:一、题目来源 AcWing算法基础课-803.区间合并 二、题目描述 给定 个区间 ,要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如: 和 可以合并为一个区间 \([1,6]
阅读全文
摘要:一、算法描述 本篇文章介绍离散化。 什么是离散化? 对于一个数组 来说,他是升序的,其中数字范围很大,例如 ~ 。 但是,数字的个数很少,只有 ~ 。 那么这种情况下就没有必要将数组开得很大从而导致浪费空间,而只需要将每一个数字进行
阅读全文
摘要:一、算法描述 本篇文章介绍位运算,直接从用法方面来介绍。 求第 K 位 将第 位移到最后面。 &1 即可。 所以操作为:n >> k & 1 求最后一个 1(求 1 的个数) = ~ = ~
阅读全文
摘要:一、题目来源 AcWing算法基础课-800.数组元素的目标和 二、题目描述 给定两个升序排序的有序数组 和 ,以及一个目标值 。 数组下标从 开始。 请你求出满足 的数对 。 数据保证有唯一解。
阅读全文
摘要:一、算法描述 含义 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。 另外还可以根据序列进行区分,例如在快排中,双指针指向的是同一个序列,而归并排序中两个指针指向的是两个不同的序列。 怎么用
阅读全文