文章归档算法题解

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

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

这道题可以用滑动窗口,但还需要处理窗口内最大值与最小值的差不能超过 limit 这一限制。如果每次都重新遍历窗口求最值,时间开销会达到 O(N)×kO(N)\times k,其中 k 是窗口长度,大窗口下容易超时。思路与我之前写的 leetcode-239. 滑动窗口最大值 相似:单调队列能以 O(1)O(1) 的时间查询当前最值。本题同时需要最大值和最小值,因此维护两个单调队列。

Python
from collections import deque

class Solution:
    def longestSubarray(self, nums: List[int], limit: int) -> int:
        max_dq = deque()
        min_dq = deque()
        res = 0
        l = 0
        for i, num in enumerate(nums):
            while max_dq and num >= nums[max_dq[-1]]:
                max_dq.pop()
            max_dq.append(i)
            while min_dq and num <= nums[min_dq[-1]]:
                min_dq.pop()
            min_dq.append(i)
            while nums[max_dq[0]] - nums[min_dq[0]] > limit:
                if max_dq[0] == l:
                    max_dq.popleft()
                if min_dq[0] == l:
                    min_dq.popleft()
                l += 1
            res = max(res, i - l + 1)
        return res

第 239 题维护定长窗口,每次向右移动一格,最多只需移除一个过期位置,缩小窗口可以用 if。本题则要用 while:移除一个元素后,最大值与最小值的差仍可能超过 limit,需要继续缩小。退出循环时,当前窗口已经满足限制,再用它的长度更新答案。

谢谢你读到这里。 ✧
搜索文章

输入关键词,找一篇想读的手记。

算法专题leetcode双指针经典练习题算法题解leetcode-1438. 绝对差不超过限制的最长连续子数组算法题解leetcode-179. 最大数算法题解leetcode-239. 滑动窗口最大值算法题解leetcode-136. 只出现一次的数字算法专题leetcode动态规划基础练习题算法专题leetcode二叉树基础练习题算法专题leetcode数组双指针练习题算法专题leetcode滑动窗口练习题算法专题leetcode链表双指针练习题算法题解洛谷-P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题算法题解leetcode-1979. 找出数组的最大公约数算法题解洛谷-B3634 最大公约数和最小公倍数算法题解洛谷-P10424 [蓝桥杯 2024 省 B] 好数算法题解洛谷-P8716 [蓝桥杯 2020 省 AB2] 回文日期自动化脚本Dr.com校园网自动登录方案算法题解leetcode-2226. 每个小孩最多能分到多少糖果算法题解leetcode-2563. 统计公平数对的数目算法题解leetcode-1.两数之和算法题解洛谷-P8218 【深进1.例1】求区间和
在这座小岛上,慢慢找。ESC 关闭