给你一个二维矩阵,权值为False
和True
,找到一个最大的矩形,使得里面的值全部为True
,输出它的面积
样例
给你一个矩阵如下
[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
输出6
class Solution {
public:
/*
* @param matrix: a boolean 2D matrix
* @return: an integer
*/
int maximalRectangle(vector<vector<bool>> &matrix) {
// write your code here
if (matrix.size() == 0 || matrix[0].size() == 0) {
return 0;
}
int max_rectangle = INT_MIN;
vector<int> heights(matrix[0].size(), 0);
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == 1) {
heights[j]++;
} else {
heights[j] = 0;
}
}
max_rectangle = max(max_rectangle, maximalRectangleArea(heights));
}
return max_rectangle;
}
int maximalRectangleArea(vector<int>& heights) {
if (heights.size() == 0) {
return 0;
}
heights.push_back(-1);
stack<int> st;
int max_rectangle = INT_MIN;
for (int i = 0; i < heights.size(); i++) {
if (!st.empty() && heights[st.top()] > heights[i]) {
while (!st.empty() && heights[st.top()] > heights[i]) {
int j = st.top();
st.pop();
int w = st.empty() ? i : i - st.top() - 1;
max_rectangle = max(heights[j] * w, max_rectangle);
}
}
st.push(i);
}
heights.pop_back();
return max_rectangle;
}
};