题目
给定一个直方图,求这个直方图中最大矩阵对应的面积是多少?
比如有个图如下 (对应的数组为:[2,1,5,6,2,3])
那么对应的最大矩形的面积应该为 10:
解
使用单调栈可以使时间复杂度为O(N)
分别以数组中的每个元素作为边,确定其对应矩阵的大小
如2 对应矩阵大小为2
1对应矩阵大小为6
5对应矩阵大小为10
6应矩阵大小为6
2对应矩阵大小为8
3对应矩阵大小为3
最大值即为解
方法:栈采用升序。遍历数组,栈为空,直接入栈,大于栈顶元素直接入栈,等于栈顶元素,使用链表在栈顶后面追加。小于栈底元素,则可以确定以栈顶为边的矩阵大小,因为栈顶下面的一个元素一定比它小,而新加入的元素也是。
遍历结束,栈不为空,栈顶和栈底构成的矩阵宽为1
int maxarea(vector<int>&obj){
stack<list<int>>help;
int ret = 0;
for (int i = 0; i < obj.size(); i++){
while (!help.empty() && obj[i] < obj[help.top().back()]){
int temp = help.top().front();
help.pop();
int left = help.empty() ? -1 : help.top().back();
int ret_temp = obj[temp] * (i - left - 1);
ret = ret>ret_temp ? ret : ret_temp;
}
if (!help.empty()&&obj[i] < obj[help.top().back()])
//这里一定不要漏了!help.empty()
help.top().push_back(i);
else{
list<int>l;
l.push_back(i);
help.push(l);
}
}
while (!help.empty()){
int temp = help.top().front();
help.pop();
int left = help.empty() ? -1 : help.top().back();
int ret_temp = obj[temp] * (obj.size() - left - 1);
ret = ret>ret_temp ? ret : ret_temp;
}
return ret;
}