题目:
-
找出最大的矩形面积,首先要有一个较好的遍历方法。
-
本题找最大面积的遍历方法可以依据依据以下策略:找出以每个矩形为高的最大矩形面积。因此我们需要遍历每一个矩形高度,找出以当前矩形高度作为高的最大矩形面积。最后遍历所有的矩形高度,最大的面积即为所求。
-
依据上述思路,为了找到以当前柱子高度作为矩形高度的最大面积,我们需要寻找矩形的左右更边界来确定矩形的宽度,因此我们可以作出以下分析:
右边界的查找:
- 右边界的柱形高度应该小于当前柱形高度
左边界的查找:
- 左边界的柱形高度应该小于当前柱形高度
因此,在我们的计算过程中,有如下图示:
假设当前下标为3,下标为3的柱形高度6,求以6作为高度的最大矩形面积。左边界为下标left=2,右边界下标为right=4,因此面积就为6*(4-2-1)
暴力解法:
代码如下:
class Solution:
def largestRectangleArea(self, heights):
maxarea = 0
for i in range(len(heights)):
left = i
cur_height = heights[i]
while left > 0 and heights[left - 1] >= cur_height:
left -= 1
right = i
while right < len(heights) - 1 and heights[right + 1] >= cur_height:
right += 1
maxarea = max(maxarea, (right - left + 1) * cur_height)
return maxarea
经过上述分析,求解本题我们可以利用单调栈进行求解,单调栈具有以下性质:
栈顶的元素是栈内最大的元素,栈底的元素是栈内最小的元素。
我们应用单调栈求解本题,在栈内存储每个柱形高度对应的原始下标,如果栈顶部下标对应的柱形高度大于当前柱形的高度,我们就可以计算栈顶部下标对应的柱形高度所可以达到的最大矩形面积;因为栈顶下的下一个元素(下标)对应的高度也小于栈顶元素(下标)对应的高度;
代码如下:
class Solution:
def largestRectangleArea(self, heights):
ans = 0
st = []
heights.insert(0,0)
heights.append(0)
for i in range(len(heights)):
while len(st) != 0 and heights[st[-1]] > heights[i]:
cur = st[-1]
st.pop()
left = st[-1] + 1
right = i - 1
ans = max(ans, (right - left + 1) *heights[cur])
st.append(i)
return ans