题目
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
思路
思路一:
暴力搜索。两层循环,分别确定左边界和右边界。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# 暴力法
# 枚举左边界
# 枚举右边界
length = len(heights)
max_area = 0
for i in range(length):
for j in range(i, length):
area = (j - i + 1) * min(heights[i:j+1])
max_area = max(max_area, area)
return max_area
最大时间复杂度:
有两个测试样例没通过…
如果我们枚举「高」,我们可以使用一重循环枚举某一根柱子,将其固定为矩形的高度 h。随后我们从这跟柱子开始向两侧延伸,直到遇到高度小于 h 的柱子,就确定了矩形的左右边界。如果左右边界之间的宽度为 w,那么对应的面积为 w * h。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n = len(heights)
max_area = 0
for mid in range(n):
left = right = mid
# 找到mid左边小于heights[mid]的前一个
while left >= 0 and heights[left] >= heights[mid]:
left -= 1
# 找到mid右边小于heights[mid]的前一个
while right < n and heights[right] >= heights[mid]:
right += 1
max_area = max(max_area, heights[mid]*(right - left - 1))
return max_area
最大时间复杂度还是。
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/ji-jian-python-shen-du-jie-xi-dan-diao-dui-zhan-zu/
代码
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack = [-1]
max_res = 0
for i in range(len(heights)):
while len(stack) > 1 and heights[i] <= heights[stack[-1]]:
max_res = max(max_res, heights[stack.pop()] * (i - stack[-1] - 1))
stack.append(i)
for i in range(len(stack)-1):
max_res = max(max_res, heights[stack.pop()]*(len(heights)-1-stack[-1]))
return max_res
作者:allen-238
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/ji-jian-python-shen-du-jie-xi-dan-diao-dui-zhan-zu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n, heights, st, ans = len(heights), [0] + heights + [0], [], 0
for i in range(n + 2):
while st and heights[st[-1]] > heights[i]:
ans = max(ans, heights[st.pop(-1)] * (i - st[-1] - 1))
st.append(i)
return ans