- 绝对差不超过限制的最长连续子数组
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
解法一:滑动窗口+单调队列
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
int ans=0;
int l=0,r=0;
int Size=nums.size();
deque<int>min_qu,max_qu;
while(r<Size){
while(!max_qu.empty()&& max_qu.back()<nums[r]){
max_qu.pop_back();
}
while(!min_qu.empty()&& min_qu.back()>nums[r]){
min_qu.pop_back();
}
max_qu.push_back(nums[r]);
min_qu.push_back(nums[r]);
while(!max_qu.empty()&&!min_qu.empty()&& max_qu.front()-min_qu.front()>limit){
if(max_qu.front()==nums[l]){
max_qu.pop_front();
}
if(min_qu.front()==nums[l]){
min_qu.pop_front();
}
l++;
}
ans=max(ans,r-l+1);
r++;
}
return ans;
}
};
`解法二:合适的数据结构加滑窗:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
int l=0,r=0;
int Size=nums.size();
int ans=0;
multiset<int>st;
while(r<Size){
st.insert(nums[r]);
while(*st.rbegin()-*st.begin()>limit){
st.erase(st.find(nums[l]));
l++;
}
ans=max(ans,r-l+1);
r++;
}
return ans;
}
};