• Maximal Rectangle


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

    Subscribe to see which companies asked this question.

    这题看起来和max square 是一样的题目,但是尝试用max square 的DP来做无法得出.主要是上一个右下角点定到的最大面积在下一次无法帮助相邻点直接得到最大rectangle. 3*4 == 2*6.

    实际如果使用DP解的话,是一个3维DP,f[i,j,k]对于坐标为i,j的点查找左上长为k的最大宽,之后进行转换.转换方程为:实际这题类似于Largest Rectangle in Histogram

    的做法,即对矩阵的每一行,纵向连续为1的地方朝上都形成了一个bar.每一行更新这个bar的高度的过程遵从DP, 每一行都求出一个最大的矩形面积.即循环调用单调递增栈解法.

    时间复杂度为O(m*n),空间复杂度为O(max(m,n))宽.栈和height的空间复杂度做一个比较,代码如下:

    class Solution(object):
        def maximalRectangle(self, matrix):
            """
            :type matrix: List[List[str]]
            :rtype: int
            """
            #f[i][j] must have height and width together
            if not matrix or not matrix[0]:
                return 0
            height = [int(n) for n in matrix[0]]
            maxRec = 0
            for i in xrange(0,len(matrix)):
                maxRec = max(maxRec, self.helper(matrix, height,i))
            return maxRec
                 
        def helper(self, matrix, height, i): #largest rectange higher or equal than this line
            stack = []
            area = 0
            for j in xrange(len(height)+1):
                curt = height[j] if j < len(height) else -1
                while stack and curt <= height[stack[-1]]:
                    h = height[stack.pop()]
                    w = j if not stack else j - stack[-1] - 1
                    area = max(area, h*w)
                stack.append(j)
            if i!= len(matrix)-1:
                for j in xrange(len(height)):
                    if matrix[i+1][j] == '1':
                        height[j] += 1
                    else:
                        height[j] = 0
            return area

  • 相关阅读:
    被@ResponseBoby注释的方法在拦截器的posthandle方法中设置cookie失效的问题
    python之异常处理
    python之url编码
    python之发送邮件
    python之使用request模块发送post和get请求
    python之小技巧积累
    python之sys.argv[]
    python之MD5加密
    python之os、sys和random模块
    python之time和datetime的常用方法
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5591443.html
Copyright © 2020-2023  润新知