这个问题要求我们对于任意
k 个相邻的元素,计算它们所能形成的最大矩形面积。对于 k 个相邻元素,面积的计算公式是:
R(k)=k×min(h[i],h[i+1],...,h[i+k−1])R(k)=k×min(h[i],h[i+1],...,h[i+k−1])
我们的任务是找到对于任意 k,R(k) 的最大值。
思路分析
-
矩形面积的计算:
- 对于
k个相邻元素,面积的计算公式是当前子数组中的最小值与k的乘积。 - 为了计算所有可能的
k的最大矩形面积,我们可以先计算每个长度为k的子数组中的最小值,再计算相应的矩形面积。
- 对于
-
滑动窗口:
- 每次我们只需要更新窗口内的最小值。使用双端队列(deque)可以帮助我们在滑动窗口中高效地找到最小值。
- 通过滑动窗口,我们可以在每个
k长度的窗口中计算矩形面积,并更新最大值。
解决方案
- 滑动窗口:我们用一个滑动窗口来遍历所有的子数组,每次滑动时,我们只需要对窗口内的最小值进行更新。
- 队列优化:使用一个双端队列来维护当前窗口中的最小值,使得每次更新窗口时,最小值能够快速找到。
算法步骤
-
对于每个
k从1到n,我们使用滑动窗口的方法来计算每个窗口的最小值。 -
使用一个双端队列维护当前窗口中的最小值,以便在每次滑动时高效更新最小值。
-
对于每个
k,计算最大矩形面积,并更新最大值。 -
代码解释
-
滑动窗口计算:
- 对于每一个
k,我们遍历从第0到第n-k的所有窗口。 - 在每个窗口内,我们使用双端队列来保持当前窗口内的最小值。队列的头部保存着最小值的索引。
- 对于每一个
-
双端队列维护最小值:
- 我们从左到右遍历数组,队列中的元素会按大小顺序排列。每次遇到比队尾元素小的值时,我们会弹出队尾的元素,直到队列中的所有元素都比当前值大或等于当前值。
- 当滑动窗口右移时,我们需要移除队列中已经不在窗口范围内的元素。
-
计算最大面积:
- 对于每个窗口,计算当前窗口的最小值(即队列头部的值),然后计算矩形的面积,更新最大面积。
复杂度分析
- 对于每个
k,滑动窗口遍历整个数组,时间复杂度为O(n)。由于我们对每个k都执行一次这个操作,因此总时间复杂度为O(n^2)。 - 双端队列的操作是
O(1),每个元素最多被加入和移除一次,因此对于每个k,滑动窗口的操作时间是O(n)。
因此,总的时间复杂度为 O(n^2),适用于中小规模的输入。