类似题:LeetCodeDifficult-【84. 柱状图中最大的矩形】
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1:https://leetcode-cn.com/problems/maximal-rectangle/solution/zui-da-ju-xing-by-leetcode/
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
# dp
# dp = [[0]*len(matrix[0])] * len(matrix) # 这种的不行,修改值会出问题
# dp = np.zeros((len(matrix), len(matrix[0])), dtype=int)
dp = [[0]*len(matrix[0]) for _ in range(len(matrix))]
ans = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == '0':
continue
width = dp[i][j] = dp[i][j-1] + 1 if j != 0 else 1
# print(dp)
# 开始以i,j为右下角的矩形顶点,往上查找
for k in range(i, -1, -1):
if dp[k][j] == 0:
break
width = min(width, dp[k][j])
# print(i,j,k, width, (i - k + 1))
ans = max(ans, width * (i - k + 1))
return ans
思路2:统计每一行中元素所在列的连续高度,就可以看成【84. 柱状图中最大的矩形】这题了。
类似题:LeetCodeDifficult-【84. 柱状图中最大的矩形】
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if matrix == []:
return 0
# 每行构成的矩形高度,与前一行有关
dp = [0]*len(matrix[0])
ans = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
dp[j] = dp[j] + 1 if matrix[i][j] == '1' else 0
# print(dp)
ans = max(ans, self.countArea(dp))
return ans
# 计算每行矩形构成的面积
def countArea(self, dp):
dp = [0] + dp + [0] # 保证最后一个是最小的,最后不会剩余
max_area = 0
stack = []
for i in range(len(dp)):
while stack != [] and dp[stack[-1]] > dp[i]:
top = stack.pop()
# print(i, stack[-1])
max_area = max(max_area, dp[top] * (i - stack[-1] - 1))
stack.append(i)
# print(dp)
return max_area