柱状图中的最大矩形

def largestRectangleArea2(self, heights) -> int:
    """
    暴力法 O(N^2), 以 heights[i] 的高度为高,求左右满足的宽
    """
    lg = len(heights)
    maxx = 0
    for i in range(lg):
        tmp = heights[i]
        left, right = i, i
        while left > 0 and heights[left - 1] >= heights[i]:
            left -= 1
        while right < lg - 1 and heights[right + 1] >= heights[i]:
            right += 1
        maxx = max(tmp * (right - left + 1), maxx)
    return maxx
    
def largestRectangleArea(heights) -> int:
    """
    单调栈, stack 递增
    cur 比 stack[-1]大,入栈; 
    cur 比 stack[-1]小,依次出栈至 stack[-1]小于cur
    以出栈元素的值为高,求宽,更新最值
    """
    heights.append(0) # 判断最后一个元素为高的情况
    lg = len(heights)
    stack = [0]
    maxx = 0
    for i in range(1, lg):
        if not stack&nbs***bsp;heights[stack[-1]] <= heights[i]:
            stack.append(i)
        else:
            while stack and heights[stack[-1]] >= heights[i]:
                h = heights[stack[-1]]
                stack.pop()
                # stack 为空,说明当前height[i] 小于 i之前所有的值
                
                w = i if not stack else i - (stack[-1] + 1)
                maxx = max(maxx, h*w)
            stack.append(i)
    return maxx

# i=3 结束时,stack = [0,3];i=4, height[4]=0时,w = i - (0 + 1) = 3
heights = [0,1,2,1] 
print(largestRectangleArea(heights))


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务