Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 6.
题目链接:https://leetcode.com/problems/maximal-rectangle/
题目分析:和正方形不同,不能记录边长做,将问题转化成n个一维的最大子矩形,经典的单调栈算法搞一搞,复杂度O(mn)
public class Solution {
public int maximalRectangle(char[][] matrix) {
int n = matrix.length;
if (n == 0) {
return 0;
}
int m = matrix[0].length;
int[] heights = new int[m + 1];
Stack<Integer> stk = new Stack<>();
int ans = 0, cur, w, pos;
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if (matrix[i][j] == '1') {
heights[j] += 1;
}
else {
heights[j] = 0;
}
}
pos = 0;
while(!stk.empty()) {
stk.pop();
}
while (pos <= m) {
if (stk.empty() || heights[stk.peek()] <= heights[pos]) {
stk.push(pos ++);
}
else {
cur = stk.peek();
stk.pop();
w = stk.empty() ? pos : pos - stk.peek() - 1;
ans = Math.max(ans, w * heights[cur]);
}
}
}
return ans;
}
}