简单线性数据结构(还嵌入了奇奇怪怪的东西)
双端栈

为了节省空间并省点事,我们把这两个栈合并,变成下面这个样子。之后,空间缩减至原来的一半

这个仅做了解,没什么用(除非真的卡常)
双端队列
双端队列允许在队头队尾插入与删除
直接用STL即可实现, 若出现卡常, 直接将deque换成list就能省下不小常数
单调队列
单调队列是一种双端队列
单调队列中, 元素总是保持单调, 因此其可以高效解决滑动窗口问题
当窗口滑开时, 出队所有在窗口外的元素
当新加入的元素要大于先前的元素时, 不断弹出队头, 直到队列再次单调
单调队列常用于优化DP等算法。一般由数组模拟而实现更小常数
下面是利用单调队列求最小值的代码参考
int head=0,tail=1;
for(int i=1;i<=n;i++){
while(head<=tail&&q2[tail]-q2[head]+1>=k) head++;
while(head<=tail&&a[q2[tail]]>a[i]) tail--;
q2[++tail]=i;
if(i>=k) cout<<a[q2[head]]<<' ';
}
优先队列
实际上, 优先队列类似于堆, 每次入队时, 自动插入到合适的位置, 其插入删除时间复杂度是对数级的, 查询复杂度则是常数级的
可以通过STL直接实现
二叉树孩子兄弟表示法
RT

浙公网安备 33010602011771号