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

相关推荐
月光船幽幽10 小时前
呼吸孔设计重塑系统稳定性
python·科技·算法
旖旎夜光10 小时前
LeetCode 991: 坏了的计算器(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
旖旎夜光10 小时前
LeetCode 553:最优除法(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
雾喔10 小时前
算法练习7
java·数据结构·算法
可编程芯片开发11 小时前
基于模糊PID控制的六步逆变器供电无刷直流电机调速simulink仿真
算法
imperialeast12 小时前
WinAXP音乐播放器8月4日更新
windows·算法·ui
ZhouDevin12 小时前
算法论文/模型微调1——CNN架构做lora微调训练
人工智能·深度学习·算法·架构·cnn
小月土星12 小时前
LeetCode 21. 合并两个有序链表 超详细题解(虚拟头结点 + 逐行代码拆解)
算法
oier_Asad.Chen12 小时前
【OI学习笔记】Floyed-Warshall算法解决传递闭包问题
c++·笔记·学习·算法·图论·最短路·传递闭包
国科安芯12 小时前
卫星星务计算机数据管理中SEU容错机制的技术实现研究——以AS32S601存储器ECC架构为例
网络·单片机·算法·fpga开发·架构·云计算·risc-v