思路:双指针+map。map记录着区间[l,r]中的最大值和最小值。如果量两最值之差超过了limit,则不断删除最左边的元素,直至量最值之差满足要求;否则的话,计算此时区间的长度,并且右移右指针。
补充:map是基于红黑树实现的,默认是按key值升序排列
写法1:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
int n = nums.size();
int l = 0; int r = 0;
map<int, int> mp; //默认按key从小到大排序
int ans = 0;
++mp[nums[r]];
while(r < n){
while(l < r && mp.rbegin()->first-mp.begin()->first > limit){
--mp[nums[l]];
if(mp[nums[l]] == 0){
mp.erase(nums[l]);
}
++l;
}
ans = max(ans, r-l+1);
++r;
if(r >= n){
break;
}
++mp[nums[r]];
}
return ans;
}
};
写法2:
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
int n = nums.size();
int l = 0; int r = 0;
map<int, int> mp; //默认按key从小到大排序
int ans = 0;
while(r < n){
++mp[nums[r]];
while(l < r && mp.rbegin()->first-mp.begin()->first > limit){
--mp[nums[l]];
if(mp[nums[l]] == 0){
mp.erase(nums[l]);
}
++l;
}
ans = max(ans, r-l+1);
++r;
}
return ans;
}
};