具体思路:
滑动窗口;
但是尤其注意一下单调队列;
具体思路:
1.麻烦的模拟:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
if(nums.size()==1)
return 1;
int l=0,r=1;
int maxn=nums[l];
int minx=nums[l];
int ret=1;
while(r<nums.size()){
maxn=max(nums[r],maxn);
minx=min(nums[r],minx);
if(abs(maxn-minx)>limit){
int index=r;
maxn=max(nums[r],INT_MIN);
minx=min(nums[r],INT_MAX);
for(int i=r-1;i>=l;i--){
if(abs(nums[r]-nums[i])>limit){
index=i+1;
break;
}else{
maxn=max(nums[i],maxn);
minx=min(nums[i],minx);
}
}
l=index;
}
ret=max(ret,r-l+1);
r++;
}
return ret;
}
};
2.利用multiset进行简化:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
if(nums.size()==1)
return 1;
int l=0,r=0;
int ret=0;
multiset<int>se;
while(r<nums.size()){
se.insert(nums[r]);
while(abs(*se.rbegin()-*se.begin())>limit){
se.erase(se.find(nums[l]));
l++;
}
ret=max(ret,r-l+1);
r++;
}
return ret;
}
};
3.单调队列问题:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
if(nums.size()==1)
return 1;
int l=0,r=0;
int ret=0;
deque<int>crease;
deque<int>decrease;
while(r<nums.size()){
while(!crease.empty()&&crease.back()<nums[r]){
crease.pop_back();
}
while(!decrease.empty()&&decrease.back()>nums[r]){
decrease.pop_back();
}
crease.push_back(nums[r]);
decrease.push_back(nums[r]);
while(!crease.empty()&&!decrease.empty()&&abs(crease.front()-decrease.front())>limit){
if(crease.front()==nums[l])
crease.pop_front();
if(decrease.front()==nums[l])
decrease.pop_front();
l++;
}
ret=max(ret,r-l+1);
r++;
}
return ret;
}
};