题目概述
解题思路
首先说下这题的暴力解法:直接二重循环,维护一个最大值一个最小值,记录从第i到第j个元素的最值。这种方法的时间复杂度是O(N^2)。
接下来说一下时间复杂度O(N)的方法:这道题是比较典型的双指针法。想到双指针法遍历以后,考虑如何维护最值。双指针法的特点在于,当前数组的头尾可能会发生变化,因此最值的维护不仅需要考虑加入元素时的最值变化,还要考虑删除元素时的变化。删除元素时,要使最值的变化操作通过O(1)的时间复杂度实现,就需要维护O(N)的空间复杂度的存储数组。我们采用生成窗口最大值数组的方法来处理该问题,即维护两个双端队列,一个存储从i开始单调递减的元素(队列首元素为最大值),一个存储从i开始单调递增的元素(队列首元素为最小值)。
具体思路是:有一前一后两个指针i和j,表示当前处理的数组的头尾位置;另有两个队列qmin和qmax,维护当前数组中的单调递增/递减元素次序。若当前数组符合条件,则右移j指针;否则表示以第i个元素为首的、符合条件的数据只有j - i个符合条件,应当