码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Maximal Rectangle

时间:2016-03-12 14:51:09      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

LeetCode解题之Maximal Rectangle


原题

一个矩阵仅包含1和0,找出其中面积最大的只含有1的矩形,并返回它的面积。

注意点:

  • 矩阵中的元素类型是字符串

例子:

输入:

matrix = 
[[‘1‘, ‘1‘, ‘0‘, ‘1‘, ‘0‘, ‘1‘],
 [‘0‘, ‘1‘, ‘0‘, ‘0‘, ‘1‘, ‘1‘],
 [‘1‘, ‘1‘, ‘1‘, ‘1‘, ‘0‘, ‘1‘],
 [‘1‘, ‘1‘, ‘1‘, ‘1‘, ‘0‘, ‘1‘]]

输出: 8

解题思路

这道题和 Largest Rectangle in Histogram 的关系非常密切。如果把1看做柱状的实体,那么这就是一个中间有空缺的柱状图。依次遍历每一行,把每一行当做柱状图的底边,就能将题目转化为Largest Rectangle in Histogram来解决。如以第二行为底,则是这样一个柱状图[1,2,0,0,1,1],容易发现规律:遍历下一行时,如果是1,则在原来的高度上加一,否则将高度置为0。

AC源码

class Solution(object):
    def maximalRectangle(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        if not matrix or not matrix[0]:
            return 0
        n = len(matrix[0])
        heights = [0 for __ in range(n + 1)]
        result = 0
        for row in matrix:
            for i in range(n):
                heights[i] = heights[i] + 1 if row[i] == ‘1‘ else 0
            stack = [-1]
            for i in range(n + 1):
                while heights[i] < heights[stack[-1]]:
                    h = heights[stack.pop()]
                    w = i - stack[-1] - 1
                    result = max(result, h * w)
                stack.append(i)
        return result


if __name__ == "__main__":
    assert Solution().maximalRectangle([[‘1‘, ‘1‘, ‘0‘, ‘1‘, ‘0‘, ‘1‘],
                                        [‘0‘, ‘1‘, ‘0‘, ‘0‘, ‘1‘, ‘1‘],
                                        [‘1‘, ‘1‘, ‘1‘, ‘1‘, ‘0‘, ‘1‘],
                                        [‘1‘, ‘1‘, ‘1‘, ‘1‘, ‘0‘, ‘1‘]]) ==8

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

LeetCode Maximal Rectangle

标签:

原文地址:http://blog.csdn.net/u013291394/article/details/50865281

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!