注:今天是代码随想录训练营的最后一天啦!!!
本文目录
84.柱状图中最大的矩形
代码随想录:84.柱状图中最大的矩形
Leetcode:84.柱状图中最大的矩形
做题
无思路。
看文章
与 42. 接雨水 很像,42. 接雨水 是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
举例说明求解:[2, 1, 5, 6, 2, 3]。以1为基准,左右都没有比1小的,所以1可以向左右拓展到底,即高为1、宽为6。以5为基准,左边1<5,右边2<5,所以5可以向左拓展到1(开区间),向右拓展到2(开区间),即高为5、宽为2。
在此基础上结合单调栈,具体可看视频。
# 单调栈
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# Monotonic Stack
'''
找每个柱子左右侧的第一个高度值小于该柱子的柱子
单调栈:栈顶到栈底:从大到小(每插入一个新的小数值时,都要弹出先前的大数值)
栈顶,栈顶的下一个元素,即将入栈的元素:这三个元素组成了最大面积的高度和宽度
情况一:当前遍历的元素heights[i]大于栈顶元素的情况
情况二:当前遍历的元素heights[i]等于栈顶元素的情况
情况三:当前遍历的元素heights[i]小于栈顶元素的情况
'''
# 输入数组首尾各补上一个0(与42.接雨水不同的是,本题原首尾的两个柱子可以作为核心柱进行最大面积尝试
heights.insert(0, 0)
heights.append(0)
stack = [0]
result = 0
for i in range(1, len(heights)):
# 情况一
if heights[i] > heights[stack[-1]]:
stack.append(i)
# 情况二
elif heights[i] == heights[stack[-1]]:
stack.pop()
stack.append(i)
# 情况三
else:
# 抛出所有较高的柱子
while stack and heights[i] < heights[stack[-1]]:
# 栈顶就是中间的柱子,主心骨
mid_index = stack[-1]
stack.pop()
if stack:
left_index = stack[-1]
right_index = i
width = right_index - left_index - 1
height = heights[mid_index]
result = max(result, width * height)
stack.append(i)
return result
时间复杂度: O(n)
空间复杂度: O(n)
以往忽略的知识点小结
- 单调栈的思路还是不熟
个人体会
完成时间:1h30min。
心得:84.柱状图中最大的矩形 与 42.接雨水 思路差不多,但为什么怎么做,还需要多琢磨琢磨。很感叹的是,算法训练营今天就结营了,感觉时间飞快。
标签:柱子,Python,栈顶,随想录,heights,柱状图,stack,84 From: https://blog.csdn.net/Xiu_Yuan123/article/details/139425791