美文网首页算法学习
算法题--求矩阵面积最大的子矩阵的面积

算法题--求矩阵面积最大的子矩阵的面积

作者: 岁月如歌2020 | 来源:发表于2020-04-25 00:22 被阅读0次
image.png

0. 链接

题目链接

1. 题目

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

Example:

Input:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

2. 思路1:逐行作为底座+寻找此底座以上的直方图往左往右能扩张的最大距离+动态规划利用之前行记录的历史

[
   ["1","0","1","0","0"],
   ["1","0","1","1","1"],
   ["1","1","1","1","1"],
   ["1","0","0","1","0"]
 ]
 
策略: 把matrix看成多个直方图, 每一行及其上方的数据都构成一个直方图, 需要考察matrix.size()个直方图
对于每个点(row, col), 我们最后都计算以这个点上方的连续的'1'往left, right方向延申可以得到的最大的矩形的面积
通过这种方法获取的矩形一定会把最大的矩形包含在内
height[row][col]记录的是(row, col)这个坐标为底座的直方图柱子的高度, 如果这个点是'0', 那么高度当然是0了
left[row][col]记录的是(row, col)这个坐标点对应的height可以延申到的最左边的位置
right[row][col]记录的是(row, col)这个坐标点对应的height可以延申到的最右边的位置+1
以上面的matrix为例,
对于(row=2, col=1)这个点, left=0, right=5, height=1
对于(row=2, col=2)这个点, left=2, right=3, height=3
(2,2)这个点与(2,1)紧挨着,left和right却已经变化如此之大了, 这是因为left和right除了受左右两边的'1'影响, 还受到了其上方连续的'1'的制约
由于点(2,2)上有height=3个'1', 这几个'1'的left的最大值作为当前点的left, 这几个'1'的right的最小值作为当前点的right
因此, 实际上, 我们是要找以hight对应的这条线段往左右两边移动(只能往全是'1'的地方移动), 可以扫过的最大面积
当hight与目标最大矩形区域的最短的height重合时, 最大矩形的面积就找到了, 如上面的例子, 就是点(2,3)或(2,4)对应的height

3. 代码

# coding:utf8
from typing import List


class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        if len(matrix) == 0:
            return 0

        m = len(matrix)
        n = len(matrix[0])
        left = [0] * n
        right = [n] * n
        height = [0] * n
        max_area = 0
        for i in range(m):
            cur_left, cur_right = 0, n
            for j in range(n):
                if matrix[i][j] == '1':
                    height[j] += 1
                else:
                    height[j] = 0

            for j in range(n):
                if matrix[i][j] == '1':
                    left[j] = max(left[j], cur_left)
                else:
                    left[j] = 0
                    cur_left = j + 1

            for j in range(n - 1, -1, -1):
                if matrix[i][j] == '1':
                    right[j] = min(right[j], cur_right)
                else:
                    right[j] = n
                    cur_right = j

            for j in range(n):
                max_area = max(max_area, height[j] * (right[j] - left[j]))

        return max_area


solution = Solution()
print(solution.maximalRectangle([
    ['1', '0', '1', '0', '0'],
    ['1', '0', '1', '1', '1'],
    ['1', '1', '1', '1', '1'],
    ['1', '0', '0', '1', '0'],
]))

输出结果

6

4. 结果

image.png

相关文章

  • 算法题--求矩阵面积最大的子矩阵的面积

    0. 链接 题目链接 1. 题目 Given a 2D binary matrix filled with 0's...

  • 直方图最大面积矩形&01矩阵中最大的全0(1)矩阵

    求直方图中最大矩形的面积,用这个思路可以进一步解决求01矩阵中最大的全0或全1矩阵 直方图中最大矩形的面积 问题描...

  • 面积最大的全1子矩阵

    题目见这里。 这个题目就是枚举搜索,找最大值。以行为例,在每一行中找到每一个左边界,然后枚举以该左边界为边界的线段...

  • 矩阵面积 (*)

    实现一个矩阵类Rectangle,包含如下的一些成员变量与函数: 1.两个共有的成员变量 width 和 he...

  • 算法题--求最大矩形面积

    0. 链接 题目链接 1. 题目 Given n non-negative integers representi...

  • 求最大子矩阵的大小

    这个题考察的是动态规划,并且要了解LeetCode第84题,要清楚直方图的面积怎么计算。 85.最大矩阵(Leet...

  • 矩阵降维问题探索

    Uva 10755 给出一个三位矩阵,求说子矩阵和最大值。 为了简化矩阵压缩的概念, 咱们可以先看二维矩阵, 求解...

  • 454. 矩阵面积

    实现一个矩阵类Rectangle,包含如下的一些成员变量与函数: 两个共有的成员变量width和height分别代...

  • 454. 矩阵面积

    实现一个矩阵类Rectangle,包含如下的一些成员变量与函数: 两个共有的成员变量 width 和 height...

  • [LintCode] 454 矩阵面积

    2017.09.03 实现一个矩阵类Rectangle,包含如下的一些成员变量与函数:两个共有的成员变量 widt...

网友评论

    本文标题:算法题--求矩阵面积最大的子矩阵的面积

    本文链接:https://www.haomeiwen.com/subject/isbcwhtx.html