85. 最大矩形
将矩形抽象成84,柱状图即可
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
st.push(-1);
int maxArea = 0;
int n = heights.size();
for (int i = 0; i < heights.size(); i++) {
while (st.top() != -1 && heights[st.top()] > heights[i]) {
//可以夹出去当前的了,栈顶的最大面积已经确定了
int cur = st.top();//可以确定的号
st.pop();
int left = st.top() + 1;
int right = i;//左闭又开
maxArea = max(maxArea, (right - left) * heights[cur]);
}
st.push(i);
}
while (st.top() != -1) {
int cur = st.top();//可以确定的号
st.pop();
int left = st.top() + 1;
int right = n;//一直到最后都没人消掉它,说明它可以延续到最后
maxArea = max(maxArea, (right - left) * heights[cur]);
}
return maxArea;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()){
return 0;
}
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int>> heights(m, vector<int>(n, 1));
for (int j = 0; j < n; j++) {
for (int i = m - 1; i >= 0; i--) {
if (i == m - 1) {
heights[i][j] = matrix[i][j] - '0';
}
else if (matrix[i][j] == '1') {
heights[i][j] = heights[i + 1][j] + 1;
}
else {
heights[i][j] = 0;
}
}
}
int maxArea = 0;
for (int i = 0; i < m; i++) {
maxArea = max(maxArea, largestRectangleArea(heights[i]));
}
return maxArea;
}
};