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

双端栈

截图_选择区域_20251123090142

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

截图_选择区域_20251123090235

这个仅做了解,没什么用(除非真的卡常)

双端队列

双端队列允许在队头队尾插入与删除

直接用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

截图_选择区域_20251123104257

posted @ 2025-11-23 10:44  -Graphic-  阅读(0)  评论(0)    收藏  举报