Leetcode_滑动窗口_高频09_1438. 绝对差不超过限制的最长连续子数组

104 阅读1分钟

这题目和滑动窗口最大值基本就是一个意思,使用滑动窗口+单调队列。

步骤

  1. 维护一个max queue
  2. 维护一个min queue
  3. 右指针一直移动,如果max - min > limit,移动左指针,直到break > limit。
class Solution {
    public int longestSubarray(int[] nums, int limit) {
        // 维护一个max queue
        // 维护一个min queue
        // 右指针一直移动,如果max - min > limit,移动左指针,直到break > limit
        int l  = 0;
        int r = 0;
        // queue只保存下标
        LinkedList<Integer> maxq =  new LinkedList<>();
        LinkedList<Integer> minq =  new LinkedList<>();
        int res = 0;
        while (r < nums.length) {
            while (!maxq.isEmpty() && nums[maxq.peekLast()] < nums[r]) {
                maxq.pollLast();
            }
            maxq.addLast(r);
            while (!minq.isEmpty() && nums[minq.peekLast()] > nums[r]) {
                minq.pollLast();
            }
            minq.addLast(r);
            // 一定要检查是否为空,并且不能直接peek后相减,而是nums[max] - nums[min]
            while (!maxq.isEmpty() && !minq.isEmpty() && nums[maxq.peekFirst()] - nums[minq.peekFirst()] > limit) {
                if (maxq.peekFirst() == l) {
                    maxq.pollFirst();
                }
                if (minq.peekFirst() == l) {
                    minq.pollFirst();
                }
                l++;
            }
            res = Math.max(res, r -  l + 1);
            r++;
        }
        return res;
        
    }
}