同时维护两个队列,都是从旧到新,分别从大到小和从小到大。最左边的就是最大值和最小值。
如果差值大于limit,则弹出最左的。要记录区间的最左端,弹出的时候更新最左端。
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
deque<int> q_max;
deque<int> q_min;
int left=0;
int n=nums.size();
int ans=1;
for(int i=0;i<n;i++){
while(!q_min.empty() && nums[q_min.back()] >= nums[i]){
q_min.pop_back();
}
q_min.push_back(i);
while(!q_max.empty() && nums[q_max.back()] <= nums[i]){
q_max.pop_back();
}
q_max.push_back(i);
while(nums[q_max.front()]-nums[q_min.front()]>limit){
if(q_max.front()<q_min.front()){
left=q_max.front()+1;
q_max.pop_front();
}
else{
left=q_min.front()+1;
q_min.pop_front();
}
}
ans=max(ans,i-left+1);
}
return ans;
}
};