题目
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。


思路
思路一:
暴力搜索。两层循环,分别确定左边界和右边界。
class Solution:def largestRectangleArea(self, heights: List[int]) -> int:# 暴力法# 枚举左边界# 枚举右边界length = len(heights)max_area = 0for 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 = 0for 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 += 1max_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 = 0for 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], [], 0for 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
