队列
巴巴多斯小魔
这个作者很懒,什么都没留下…
展开
-
leetcode 1438. 绝对差不超过限制的最长连续子数组 (尺取+单调队列维护窗口最大最小值 直接秒)
题目 参考 剑指 Offer 59 - II class Solution { public: #define N 100005 #define INF 0x3f3f3f3f int q1[N],head1=1,tail1=0; int q2[N],head2=1,tail2=0; void push(int x){ while(head1<=tail1&&q1[tail1]<x) --tail1; q1[原创 2021-02-21 00:48:40 · 105 阅读 · 0 评论 -
leetcode 862. 和至少为 K 的最短子数组(单调队列!妙蛙)
题目 前缀和 越大还越靠前的肯定要被淘汰。 对于每个i,前面满足sum[i]-sum[q[head]]>=K的,++head就可以了 因为 后面的i,肯定不会用这些head。与其这些head被 i 后面的使用,为啥不被 i 使用,所以head被后面的 i 用了也没用,不是最优,所以不用。 class Solution { #define INF 0x3f3f3f3f public: int getsum(int i,int *sum){return (i==-1)?0:sum[i];}原创 2020-11-30 23:56:21 · 130 阅读 · 0 评论 -
leetcode 480. 滑动窗口中位数(用两个个数一样或差1的大小根堆实现) + 剑指 Offer 41. 数据流中的中位数
题目 比如 123456789 k=4; 刚开始q1(大根堆里面是) 21 ,q2是 34 则通过q1的栈顶或者和q2的栈顶得到中位数。 删除元素怎么办呢?比如q1删除了元素4,则++mp[4],标记一下,那q1减了一个元素,0<=q1-q2<=1就不满足啦,所以应该标记一下这个数。 同样插入元素x的时候,x<=q1.top(),插入q1,否则插入q2。也会导致不平衡,平衡是为了保证求中位数的策略是对的。 删除和插入完之后应该通过这个标记的数,决定q1给q2多少元素,或者q2给q1多少。原创 2020-11-12 14:41:43 · 100 阅读 · 0 评论 -
leetcode 剑指 Offer 59 - II. 队列的最大值(设计一种数据结构可以max_value push_back pop_front 单调不递减队列)
题目 官方答案:单调不递减队列 这样不用记cnt1 cnt2来维护 单调队列里面队头是否有效了。 class MaxQueue { public: queue<int>q1; deque<int>q2; MaxQueue() { } int max_value() { if(q2.empty()) return -1; return q2.front(); } void p原创 2020-11-12 14:39:53 · 128 阅读 · 0 评论