[LeetCode] 85. Maximal Rectangle
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.
求一个矩阵内,面积最大的长方形。
思路,基于84题,对每一行,计算84题的解,记录最大值即可。
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
==>
第一行 1 0 1 0 0 –> 求解84题
第二行 2 0 2 1 1 –> 求解84题
第三行 3 0 3 2 2 –> 求解84题
第二行 4 0 0 3 0 –> 求解84题
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
stack<int> cnt_st;
int len = heights.size();
int res = 0;
for (int i=0; i<len; ++i) {
int cnt = 0;
if (!st.empty() && st.top() > heights[i]) {
while (!st.empty() && st.top() > heights[i]) {
int tmp = st.top();
st.pop();
cnt += cnt_st.top();
cnt_st.pop();
if (res < tmp*cnt) res = tmp*cnt;
}
}
st.push(heights[i]);
cnt_st.push(cnt+1);
}
int cnt = 0;
while (!st.empty()) {
int tmp = st.top();
st.pop();
cnt += cnt_st.top();
cnt_st.pop();
if (res < tmp*cnt) res = tmp*cnt;
}
return res;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int ilen = matrix.size();
if (ilen == 0) return 0;
int jlen = matrix[0].size();
if (jlen == 0) return 0;
vector<vector<int>> heights(ilen, vector<int>(jlen));
for (int i=0; i<ilen; ++i) {
for (int j=0; j<jlen; ++j) {
if (matrix[i][j] == '0') {
heights[i][j] = 0;
} else {
if (i == 0) {
heights[i][j] = 1;
} else {
heights[i][j] = heights[i-1][j] + 1;
}
}
}
}
int res = 0;
for (int i=0; i<ilen; ++i) {
int tmp = largestRectangleArea(heights[i]);
if (tmp > res) res = tmp;
}
return res;
}
};