LeetCode Maximal Rectangle
Posted gavinfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Maximal Rectangle相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章