LeetCode每日一题,1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
先看题目描述
大意就是给定一个数组 nums 和一个整数 limit,让我们求出 nums 的最长连续子数组长度,该子数组满足其中最大值和最小值之差不超过 limit
算法和思路
滑动窗口
这题很快就想到用滑动窗口做,当滑动窗口内的最大值与最小值之差不超过 limit 时扩张滑动窗口,否则就移动滑动窗口,最后返回滑动窗口的长度即可。这题的难点在于如何快速的求出滑动窗口内的最大值与最小值,如果通过遍历滑动窗口内元素来求,时间复杂度过高,我们可以通过采用合适的数据结构,来优化时间复杂度。下面的代码中将展示三种数据结构的写法
算法源码
滑动窗口+优先级队列
可以使用两个优先级队列,分别按照升序和降序存储滑动窗口内元素,从而得到滑动窗口内元素的最大值和最小值,代码中使用到了延迟删除的技巧
1 | class Solution { |
滑动窗口+有序集合
为了方便统计滑动窗口内的最大值与最小值,我们可以使用平衡树来维护窗口内元素的有序集合,例如 Java 语言中自带的红黑树 TreeMap
1 | class Solution { |
滑动窗口+单调队列
在实际代码中,我们使用一个单调递增的队列 queMin 维护最小值,一个单调递减的队列 queMax 维护最大值。这样我们只需要计算两个队列的队首的差值,即可知道当前窗口是否满足条件
1 | class Solution { |