寻找直方图中的最大矩形 Largest Rectangle in Histogram

来源:互联网 发布:西安办公软件培训中心 编辑:程序博客网 时间:2024/06/13 23:25

题目:Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.For example,Given height = [2,1,5,6,2,3],return 10.

思路:矩形的高度瓶颈在于最小的高度。顺序扫描数组元素,同时在栈中维护一个递增的序列。当栈为空或是遇到比栈顶元素大的元素时,则认为瓶颈还未到来,只入栈而不计算;当遇到比栈顶元素小的元素时,则认为到达一个瓶颈,则对瓶颈左侧的矩形进行清算。

当扫描完毕后,再对栈中遗留下的元素进行清算。 

该方法的时间复杂度O(N),空间复杂度O(N)。

class Solution {public:int max(int a, int b){if(a > b)return a;elsereturn b;}int largestRectangleArea(vector<int> &height) {stack<int> s; //注意栈中存的是下标int len = height.size();int maxs = 0;int k;for(int i=0; i<len; i++){if(s.empty() || height[s.top()] <= height[i])s.push(i);else{while(!s.empty() && height[s.top()] > height[i]){k = s.top();s.pop();if(s.empty()) //注意时刻防止栈为空maxs = max(maxs, i*height[k]);elsemaxs = max(maxs, (i-s.top()-1)*height[k]);}s.push(i);}}while(!s.empty()){k = s.top();s.pop();if(s.empty()) //注意时刻防止栈为空maxs = max(maxs, len*height[k]);elsemaxs = max(maxs, (len-s.top()-1)*height[k]);}return maxs;}};

0 0
原创粉丝点击