2d-array
monotonic deque
dp
]
Leetcode 0085. Maximal Rectangle
Problem statement
https://leetcode.com/problems/maximal-rectangle/
Solution
There is dp O(n^2m^2) solution. We can do better, with O(nm*min(m,n)) complexity, if we use dynamic programming and keep two tables: h[i][j] is the largest L, such that all elements in A[i:i+L-1][j] = 1, and similar w[i][j]. Then we go through our original table A and we can calculate for A[i][j] the largest subarray that has A[i][j] as its bottom-left corner, it can be done with O(n) iterations.
Finally, there is very smart way with complexity O(nm), using problem 0084. Indeed, for each row we can evaluate our skyline heights, given previous row in O(m) and do it n times. Additional complexity is O(m), because actually we need to keep only one row at at time.
Complexity
It is O(nm) for time and O(m) for space.
Code
class Solution:
def maximalRectangle(self, matrix):
def hist(heights):
stack, ans = [], 0
for i, h in enumerate(heights + [0]):
while stack and heights[stack[-1]] >= h:
H = heights[stack.pop()]
W = i if not stack else i-stack[-1]-1
ans = max(ans, H*W)
stack.append(i)
return ans
if not matrix or not matrix[0]: return 0
m, n, ans = len(matrix[0]), len(matrix), 0
row = [0]*m
for i in range(n):
for j in range(m):
row[j] = 0 if matrix[i][j] == "0" else row[j] + 1
ans = max(ans, hist(row))
return ans