为什么可以用滑动窗口?
对于给定区间[i,j]不满足要求,那么对于j'>j的区间,[i,j']也不满足要求,对于i<i', [i',j], [i',j']均不满足要求,i,j具有单调性。
维护一个滑动窗口[i,j]满足要求,为了检验[i,j]满足要求,我们必须维护一段区间的最大值和最小值。最直接的想法,使用map<int,int>
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
// 维护区间里的最大值以及最小值
map<int,int> treeMap;
int res = 0;
for(int i=0,j=0;j<nums.size();j++){
treeMap[nums[j]]++;
while(abs(nums[j]-treeMap.begin()->first)>limit||abs(nums[j]-treeMap.rbegin()->first)>limit){
treeMap[nums[i]]--;
if(treeMap[nums[i]]==0){
treeMap.erase(nums[i]);
}
i++;
}
res = max(res,j-i+1);
}
return res;
}
};
还可以用单调队列维护区间内的最大值和最小值,这个做法留作思考。