Largest Rectangle in Histogram

方法一:暴力法O(n2)

    int largestRectangleArea(vector<int> &height) {
        int end = height.size();
    	int begin = 0;
	int largestarea = 0;
	for(int i = begin; i < end; ++i)
	{
		int area;
		int high = height[i];
		for(int j = i; j < end; ++j){
			if(height[j] < high) high = height[j];//保存更小的高度
			area = (j - i + 1)*high;//计算小的面积
			if(area > largestarea) largestarea = area;//比较保存
		}
	}
	return largestarea;
    }

方法二:时间复杂度(O(n))栈只保存单调递增的元素,遇到一个比height[stk.top()]小的就停止,此时i就是这个小的的下标。然后不断弹出(直到栈中元素小于当前元素),并保存弹出的这个高作为计算的高,至于底的计算,若弹出后栈已经为空,底为i,若栈不为空,底为(i - stk.top() - 1

#include<stack>
#include<vector>
int max(int a,int b){return (a>b? a:b);}
int largestRectangleArea(vector<int> &vec){
    vec.push_back(0);
    stack<int> stk;
    stk.push(0);
    int i=0;
    int maxArea = 0;
    while( i<vec.size() ){
        if(stk.empty()||vec[stk.top()]<=vec[i]){
            stk.push(i++);
        }else{
            int t = stk.top();
            stk.pop();
            maxArea = max(maxArea, vec[t] * (stk.empty() ? i : i - stk.top() - 1));
        }
    }
    return maxArea;
}


你可能感兴趣的:(Largest Rectangle in Histogram)