LeetCode 1438 绝对差不超过限制的最长连续子数组

LeetCode 1438 绝对差不超过限制的最长连续子数组

🟡 中等

https://leetcode.cn/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/description/

使用单调队列 [26-239滑动窗口最大值](LeetCode 239 滑动窗口最大值.md) 只不过本题同时维护最大和最小。

class Solution {

public:

    int longestSubarray(vector<int>& nums, int limit) {

        deque<int> maxDeque, minDeque;

        int left = 0, res = 0;

        for (int i = 0; i < nums.size(); i++) {

            while (!maxDeque.empty() && nums[maxDeque.back()] <= nums[i]) {

                maxDeque.pop_back();

            }

            while (!minDeque.empty() && nums[minDeque.back()] >= nums[i]) {

                minDeque.pop_back();

            }

            maxDeque.push_back(i);

            minDeque.push_back(i);

            // 如果当前窗口内的最大值和最小值之差超过limit,则移动左边界
			// 因为是队列,因此最左边的元素一定在对头。
            while (nums[maxDeque.front()] - nums[minDeque.front()] > limit) {

                if (maxDeque.front() == left) maxDeque.pop_front();

                if (minDeque.front() == left) minDeque.pop_front();

                left++;

            }

            res = max(res, i - left + 1);

        }

        return res;

    }

};

分块和预处理