题目解析 我们给定一个数组 heights,其中每个元素代表一种高度。对于数组中任意连续的 k 个相邻元素,要计算它们所能形成的最大矩形面积。定义这个矩形面积 R(k) 为 k 乘以这 k 个相邻元素中的最小值。我们的任务就是找出对于所有可能的 k,R(k) 的最大值。
### 解题步骤
1. 暴力解法思路(不推荐,但有助于理解问题): - 我们可以通过两层嵌套的循环来遍历所有可能的连续 k 个元素的组合。外层循环用于确定起始位置 i,内层循环用于从起始位置开始选取连续的 k 个元素。 - 对于每一组连续的 k 个元素,我们找到其中的最小值 min_height,然后计算面积 area = k * min_height。 - 在遍历完所有可能的组合后,我们就能找到最大的面积值。 - 然而,这种方法的时间复杂度非常高,是 O(n^2),其中 n 是数组的长度,因为我们需要对每个可能的子数组都进行计算。
2. 优化解法思路(使用单调栈): - 我们可以利用单调栈来解决这个问题。单调栈是一种特殊的数据结构,在本题中,我们维护一个单调递增的栈。 - 首先,我们在数组 heights 的两端分别添加一个高度为0的虚拟元素,这有助于简化边界处理。 - 然后,我们遍历数组(包括虚拟元素),对于每个元素 height: - 当栈不为空且当前元素小于栈顶元素对应的高度时,我们弹出栈顶元素,并计算以栈顶元素为高度的矩形面积。 - 计算面积时,我们需要知道矩形的宽度。宽度可以通过当前索引与栈顶元素弹出后栈顶的新索引之差来确定。 - 我们持续弹出栈顶元素并计算面积,直到栈为空或者当前元素不小于栈顶元素对应的高度。 - 最后,我们将当前元素的索引压入栈中。 - 在遍历完整个数组后,我们就可以得到所有可能的矩形面积,从中找出最大值即可。 ### Python代码实现
def max_rectangular_area(heights):
stack = []
n = len(heights)
left = [0] * n
right = [n] * n
max_area = 0
# 计算每个元素左边第一个比它小的元素的位置
for i in range(n):
while stack and heights[stack[-1]] >= heights[i]:
stack.pop()
left[i] = stack[-1] if stack else -1
stack.append(i)
stack = []
# 计算每个元素右边第一个比它小的元素的位置
for i in range(n - 1, -1, -1):
while stack and heights[stack[-1]] >= heights[i]:
stack.pop()
right[i] = stack[-1] if stack else n
stack.append(i)
# 计算以每个元素为最小值的最大矩形面积,并更新全局最大值
for i in range(n):
area = heights[i] * (right[i] - left[i] - 1)
max_area = max(max_area, area)
return max_area
def solution(n, array):
# 直接调用上面的函数来计算最大矩形面积
return max_rectangular_area(array)
测试结果 我们可以使用以下方式来测试代码:
python # 示例数组 heights_example = [2, 1, 5, 6, 2, 3] result = max_rectangular_area(heights_example) print("最大矩形面积:", result) 在上述示例中,对于数组 [2, 1, 5, 6, 2, 3],运行代码后会输出最大矩形面积的值。你可以根据需要修改示例数组来测试不同的输入情况。 通过上述代码,我们能够高效地找出给定数组中任意连续 k 个相邻元素所能形成的最大矩形面积的最大值。