题目链接
题解
- Python3 前缀和+单调栈计算最大矩形
思路
代码
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix: return 0
res = 0
m, n = len(matrix), len(matrix[0])
heights = [0] * (n + 1)
for i in range(m):
for j in range(n):
heights[j] = heights[j] + 1 if matrix[i][j] == '1' else 0
stack = [-1]
for k, num in enumerate(heights):
while heights[stack[-1]] > num:
cur_h = heights[stack.pop()]
cur_w = k - stack[-1] - 1
res = max(res, cur_h * cur_w)
stack.append(k)
return res
223. (需要算重叠部分的)矩形面积(Medium)
class Solution:
def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:
s1 = (ax2 - ax1) * (ay2 - ay1)
s2 = (bx2 - bx1) * (by2 - by1)
a = max(min(ax2, bx2) - max(ax1, bx1), 0)
b = max(min(ay2, by2) - max(ay1, by1), 0)
return s1 + s2 - a * b
1139. 最大的以 1 为边界的正方形
class Solution:
def largest1BorderedSquare(self, grid):
m, n = len(grid), len(grid[0])
left = [[0] * (n + 1) for _ in range(m + 1)]
up = [[0] * (n + 1) for _ in range(m + 1)]
maxBorder = 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if grid[i - 1][j - 1]:
left[i][j] = left[i][j - 1] + 1
up[i][j] = up[i - 1][j] + 1
border = min(left[i][j], up[i][j])
while left[i - border + 1][j] < border or up[i][j - border + 1] < border:
border -= 1
maxBorder = max(maxBorder, border)
return maxBorder ** 2
数学问题!!!