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[++tail1]=x;
while(head2<=tail2&&q2[tail2]>x) --tail2;
q2[++tail2]=x;
}
void pop(int x){
if(head1<=tail1&&q1[head1]==x) ++head1;
if(head2<=tail2&&q2[head2]==x) ++head2;
}
bool isok(int x,int limit){
int mx=q1[head1],mi=q2[head2];
if(x>=mi&&x<=mx) return true;
return x>mx&&x<=mi+limit||x<mi&&x>=mx-limit;
}
int longestSubarray(vector<int>& a, int limit) {
int n=a.size(),ans=0;
int l=0,r=0;
while(l<n){
while(r<n&&(r==l||isok(a[r],limit))) push(a[r++]);
ans=max(ans,r-l);
pop(a[l++]);
}
return ans;
}
};
leetcode 1438. 绝对差不超过限制的最长连续子数组 (尺取+单调队列维护窗口最大最小值 直接秒)
最新推荐文章于 2024-04-22 17:26:33 发布