首先转载单调栈小结博客:LeetCode Monotone Stack Summary 单调栈小结
LeetCode 84:
static int x = []()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
stack<int> index;
int maxarea = 0;
for(int i=0;i<heights.size();++i)
{
if(index.empty()||heights[i]>heights[index.top()])
{
index.push(i);
}
else
{
int cur = index.top();
index.pop();
maxarea = heights[cur]*(index.empty()==true?i:(i-index.top()-1))>maxarea?heights[cur]*(index.empty()==true?i:(i-index.top()-1)):maxarea;
--i;
}
}
return maxarea;
}
};
LeetCode 85:
static int x = []()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()==true)
return 0;
int row = matrix.size();
int col = matrix[0].size();
vector<int> store;
int ans = 0;
for(int i=1;i<row;++i)
{
for(int j=0;j<col;++j)
{
if(matrix[i][j]=='1')
{
matrix[i][j] = matrix[i-1][j] + 1;
}
}
} //使每行单独有意义
for(int i=0;i<row;++i)
{
store.clear();
for(int j=0;j<col;++j)
{
store.push_back(matrix[i][j]-'0');
}
store.push_back(0);
int tempans = getMaxarea(store);
ans = tempans>ans?tempans:ans;
}
return ans;
}
private:
int getMaxarea(vector<int>& store)
{
stack<int> index;
int area = 0;
for(int i=0;i<store.size();++i)
{
if(index.empty()||store[i]>store[index.top()])
{
index.push(i);
}
else
{
int cur = store[index.top()];
index.pop();
area = (index.empty()==true?i:i-index.top()-1)*cur>area?(index.empty()==true?i:i-index.top()-1)*cur:area;
--i;
}
}
return area;
}
};