剑指 Offer II 039. 直方图最大矩形面积
单调栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int>s;s.push(-1);
int mmax = 0;
for(int i = 0; i < heights.size(); i++){
if(s.empty()) s.push(i);
else{
while(s.top() != -1 && heights[s.top()] >= heights[i]){
int height = heights[s.top()];
s.pop();
int width = i - s.top() - 1;
mmax = max(mmax, height * width);
}
s.push(i);
}
}
while(s.top() != -1){
int height = heights[s.top()];
s.pop();
int width = heights.size()-s.top()-1;
mmax=max(mmax, height*width);
}
return mmax;
}
};
剑指 Offer II 040. 矩阵中最大的矩形
分解成每一层,然后调用上一题的函数
class Solution {
public:
int maximalRectangle(vector<string>& matrix) {
if(matrix.size() == 0) return 0;
vector<int>heights(matrix[0].size(),0);
int mmax=0;
for(int i = 0; i < matrix[0].size(); i++){
if(matrix[0][i] == '1') heights[i] = 1;
else heights[i] = 0;
}
mmax = max(mmax,largestRectangleArea(heights));
for(int i = 1; i< matrix.size(); i++){
for(int j = 0; j< matrix[i].size(); j++){
if(matrix[i][j] == '1') heights[j]++ ;
else heights[j] = 0;
}
mmax = max(mmax,largestRectangleArea(heights));
}
return mmax;
}
int largestRectangleArea(vector<int>& heights) {
stack<int>s;s.push(-1);
int mmax = 0;
for(int i = 0; i < heights.size(); i++){
if(s.empty()) s.push(i);
else{
while(s.top() != -1 && heights[s.top()] >= heights[i]){
int height = heights[s.top()];
s.pop();
int width = i - s.top() - 1;
mmax = max(mmax, height * width);
}
s.push(i);
}
}
while(s.top() != -1){
int height = heights[s.top()];
s.pop();
int width = heights.size()-s.top()-1;
mmax=max(mmax, height*width);
}
return mmax;
}
};