绝对值差不少于limit的最长连续子序列

给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 

如果不存在满足条件的子数组,则返回 0 。


滑动窗口+单调队列
单调性显然:窗口长度增加,最大值增加(>=),最小值增加(>=)
用单调队列维护滑动窗口中的最值


//这里min和mx写反了
const int N = 1e5 + 10;
int mx[N],mini[N];
class Solution {
public:
    int longestSubarray(vector<int>& a, int limit) {
        int Lmx = 1, Rmx = 0;
        int Lmi = 1, Rmi = 0;
        int n = a.size();
        int ans = 0;
        for (int L = 0, R = 0; R <= n-1; R++) {
            while (Rmx - Lmx + 1 >= 1 && a[R] < a[mx[Rmx]]) {
                Rmx--;
            }
            mx[++Rmx] = R;
            while (Rmi - Lmi + 1 >= 1 && a[R] > a[mini[Rmi]]) {
                Rmi--;
            }
            mini[++Rmi] = R;
            while (R - L + 1 >= 1 && a[mini[Lmi]] - a[mx[Lmx]] > limit) {
                L++;
                while (mx[Lmx] < L) {
                    Lmx++;
                }
                while (mini[Lmi] < L) {
                    Lmi++;
                }
            }
            ans = max(ans,R-L+1);
        }
        return ans;
    }
};
github