原題
給你一個二維矩陣,權值為False和True,找到一個最大的矩形,使得里面的值全部為True,輸出它的面積
樣例
給你一個矩陣如下
[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
輸出6
解題思路
轉化
- 根據上圖,可以清楚的看出本題可以轉化為Largest Rectangle in Histogarm來做
- 初始化height = [0, 0 ,0 ....]
- 對于每一行,先求出以這一行為x軸的每個柱子的高度,求解時,可以每次基于上一行的值進行更新。然后O(n)的時間求出最大矩形,不斷更新全局變量res
- 時間復雜度為 O(n * (n + n)) = O(n2)
完整代碼
class Solution(object):
def maximalRectangle(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
res = 0
if not matrix:
return res
height = [0 for i in range(len(matrix[0]))]
for row in matrix:
for i in range(len(row)):
if row[i] == '0':
height[i] = 0
else:
height[i] += 1
res = max(res, self.largestRectangleArea(height))
return res
def largestRectangleArea(self, height):
if not height:
return 0
res = 0
stack = []
height.append(-1)
for i in range(len(height)):
current = height[i]
while len(stack) != 0 and current <= height[stack[-1]]:
h = height[stack.pop()]
w = i if len(stack) == 0 else i - stack[-1] - 1
res = max(res, h * w)
stack.append(i)
return res