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

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

这个题目看到要找一个最长连续的子数组,就可以知道肯定是要用滑动窗口的,但是我们不能简单的套用滑动窗口的模板,题目的一个限制是,窗口内的最大元素减最小元素的差值要小于等于limit。如果我们每次都对窗口求一次最大最小值,时间复杂度就O(N)\\times k,k是窗口的长度,在这个题目是需要超时的。既然每次都需要最大最小值。和我之前写这篇文章是类似的 leetcode-239. 滑动窗口最大值***。***维护一个单调队列,我们就能在O(1)的时间复杂度查询最值,只不过这个题目即需要最大值,又需要最小值,我们需要维护两个单调队列。

复制代码
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的,有可能移除了一个元素之后,依然是不符合条件需要继续缩小的。缩小完之后的窗口一定是符合条件的,更新答案就可以了。

相关推荐
weixin_531094692 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳2 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞2 小时前
win系统安装minio
java·数据结构·算法
青少儿编程课堂2 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
我命由我123453 小时前
Photoshop - Photoshop 矢量蒙版
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
longlongzihan3 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
waoooqwe3 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
苦瓜打怪兽3 小时前
leetcode 热题100(11. 盛最多水的容器)
python·算法·leetcode
w_zero_one4 小时前
链表(4)
java·数据结构·算法
吠品4 小时前
GitHub 周榜拆解:决策小模型扎堆上位
c语言·开发语言·算法