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

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

文章目录

思路

这个问题可以使用滑动窗口和两个单调队列来解决。一个单调队列用来维护窗口内的最大值,另一个单调队列用来维护窗口内的最小值。我们从左到右遍历数组,对于每个元素,我们首先检查如果将这个元素加入窗口后,窗口内的最大值和最小值的差是否超过限制。如果超过限制,我们就移动窗口的左边界,直到窗口内的最大值和最小值的差不超过限制为止。

解题方法

我们首先初始化两个空的单调队列和一个结果变量。然后,我们从左到右遍历输入数组,对于每个元素,我们首先检查如果将这个元素加入窗口后,窗口内的最大值和最小值的差是否超过限制。如果超过限制,我们就移动窗口的左边界,直到窗口内的最大值和最小值的差不超过限制为止。然后,我们将当前元素加入到两个单调队列中,并更新结果变量。

复杂度

时间复杂度:

O ( n ) O(n) O(n),其中n是数组的长度。每个元素只会被加入到单调队列一次,所以时间复杂度是线性的。

空间复杂度:

O ( n ) O(n) O(n),在最坏的情况下,两个单调队列中可能会包含所有的元素,所以空间复杂度是线性的。

Code

java 复制代码
class Solution {
    public static int MAXN = 100010;
    public static int[] maxdeque = new int[MAXN];
    public static int[] mindeque = new int[MAXN];
    public static int maxh, maxt, minh, mint;
    public static int[] arr;

    public static int longestSubarray(int[] nums, int limit) {
        maxh = maxt = minh = mint = 0;
        int n = nums.length;
        arr = nums;
        int ans = 0;
        for (int l = 0, r = 0; l < n; l++) {
            while (r < n && ok(limit, nums[r])) {
                push(r++);
            }
            ans = Math.max(ans, r - l);
            poll(l);
        }
        return ans;
    }
    public static void push(int r) {
        while(maxh < maxt && arr[maxdeque[maxt - 1]] <= arr[r]) {
            maxt--;
        }
        maxdeque[maxt++] = r;
        while(minh < mint && arr[mindeque[mint - 1]] >= arr[r]) {
            mint--;
        }
        mindeque[mint++] = r;

    }

    public static void poll(int l) {
        if(maxh < maxt && maxdeque[maxh] == l) {
            maxh++;
        }
        if(minh < mint && mindeque[minh] == l) {
            minh++;
        }
    }

    public static boolean ok(int limit, int number) {
        int max = maxh < maxt ? Math.max(arr[maxdeque[maxh]], number) : number;
        int min = minh < mint ? Math.min(arr[mindeque[minh]], number) : number;
        return max - min <= limit;
    }
}
相关推荐
后来后来啊21 小时前
2026.2.2 & 2.3学习笔记
数据结构·笔记·学习·算法·leetcode
YuTaoShao21 小时前
【LeetCode 每日一题】3013. 将数组分成最小总代价的子数组 II
算法·leetcode·职场和发展
爱尔兰极光21 小时前
LeetCode 热题 100--字母异位词分组
算法·leetcode·职场和发展
im_AMBER21 小时前
Leetcode 112 两数相加 II
笔记·学习·算法·leetcode
sin_hielo21 小时前
leetcode 3637
数据结构·算法·leetcode
2401_841495641 天前
【LeetCode刷题】翻转二叉树
python·算法·leetcode··递归·节点·翻转二叉树
小龙报1 天前
【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
c语言·开发语言·数据结构·c++·算法·leetcode·链表
sin_hielo1 天前
leetcode 3013
数据结构·算法·leetcode
老鼠只爱大米1 天前
LeetCode经典算法面试题 #105:从前序与中序遍历序列构造二叉树(分治递归法、栈辅助迭代法等五种实现方案详细解析)
算法·leetcode·二叉树·分治算法·前序遍历·迭代法·二叉树构造
芒克芒克1 天前
LeetCode 题解:除自身以外数组的乘积
算法·leetcode