📌  相关文章
📜  没有给定点的最大矩形的面积(1)

📅  最后修改于: 2023-12-03 15:40:43.810000             🧑  作者: Mango

没有给定点的最大矩形的面积

对于给定的 01 矩阵,求出没有给定点的最大矩形的面积。

本问题可以使用单调栈算法进行求解。

算法思路

假设我们已经求出了每一行中每个位置往上连续 1 的个数(也就是每一行的高度)。那么问题就转化成了:给定一个柱状图,求其最大矩形面积。

可以使用单调栈算法进行求解:

  1. 构造一个栈,用来存储柱子的下标。
  2. 遍历每个柱子,当栈为空或当前柱子的高度大于等于栈顶柱子的高度时,将当前柱子的下标入栈;否则就一直弹出栈顶,直到栈为空或当前柱子的高度大于等于栈顶柱子的高度,每次弹出栈顶时计算以该柱子高度为矩形高度的最大矩形面积,并将最大值更新。
  3. 遍历结束后,若栈非空,则针对栈中每个柱子,以该柱子高度为矩形高度,宽度为矩形最右侧柱子的下标减去该柱子左侧柱子的下标,计算最大矩形面积,并将最大值更新。
代码实现
def largestRectangleArea(heights: List[int]) -> int:
    stack = []
    ans = 0
    heights.append(0)  # 加上一个高度为 0 的柱子,确保所有柱子都可以被处理到
    for i in range(len(heights)):
        while stack and heights[i] < heights[stack[-1]]:
            h = heights[stack.pop()]
            w = i if not stack else i - stack[-1] - 1
            ans = max(ans, h * w)
        stack.append(i)
    return ans

def maximalRectangle(matrix: List[List[str]]) -> int:
    if not matrix:
        return 0
    m, n = len(matrix), len(matrix[0])
    heights = [0] * n  # 初始化每个柱子的高度
    ans = 0
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == '1':
                heights[j] += 1
            else:
                heights[j] = 0
        area = largestRectangleArea(heights)
        ans = max(ans, area)
    return ans
复杂度分析
  • 时间复杂度:$O(mn)$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数。对于每个元素,最多要遍历该元素上方的所有元素,因此总时间复杂度为 $O(mn)$。
  • 空间复杂度:$O(n)$,其中 $n$ 是矩阵的列数。除了存储每个柱子的高度以外,空间复杂度为单调栈占用的空间,即最多为 $O(n)$。