编程实现: 工人砌了一面奇特的砖墙,该墙由N列砖组成(1≤N≤106),且每列砖的数量为Ki(1≤Ki≤104,相邻两列砖之间无缝隙),每块砖的长宽高都为1。 小蓝为了美化这面墙,需要在这面墙中找到一块面积最大的矩形用于涂鸦,那么请你帮助小蓝找出最大矩形,并输出其面积。 例如:N = 6,表示这面墙有6列,每列砖的数量依次为3、2、1、5、6、2,如下图: 图中虚线部分是一块面积最大的矩形,其面积为10。 输入描述 第一行输入一个正整数N(1≤N≤106),表示这面砖墙由几列砖组成 第二行输入N个正整数Ki(1≤Ki≤104),表示每列砖的数量,正整数之间以一个空格隔开 输出描述 输出一个正整数,表示最大矩形的面积
时间: 2023-12-04 16:05:37 浏览: 214
这道题可以使用单调栈来解决。具体思路如下:
1. 首先将第一列砖的高度入栈,然后从第二列砖开始,依次处理每一列砖。
2. 对于每一列砖,如果其高度小于等于栈顶元素的高度,就将这些栈顶元素弹出,并计算以每个栈顶元素为高度的最大矩形面积,更新最大面积。
3. 然后将当前列砖的高度入栈。
4. 处理完所有列砖后,如果栈中还有元素,就依次将栈顶元素弹出,并计算以每个栈顶元素为高度的最大矩形面积,更新最大面积。
以下是Python代码实现:
```python
n = int(input())
heights = list(map(int, input().split()))
stack = []
max_area = 0
for i in range(n):
while stack and heights[i] <= heights[stack[-1]]:
h = heights[stack.pop()]
w = i if not stack else i - stack[-1] - 1
max_area = max(max_area, h * w)
stack.append(i)
while stack:
h = heights[stack.pop()]
w = n if not stack else n - stack[-1] - 1
max_area = max(max_area, h * w)
print(max_area)
```
时间复杂度为O(n),空间复杂度为O(n)。
阅读全文