给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

输入: heights = [2,4]
输出: 4
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int v_len = heights.size();
int *stk = new int[v_len];
int area_max, stk_pos, area, left, right, i, h, temp, temp_pos;
area_max = 0;
stk_pos = 0;
for(i = 0; i < v_len;){
if(stk_pos == 0 || heights[i] >= heights[stk[stk_pos-1]]){
if(heights[i] != 0){
stk[stk_pos++] = i;
}
i++;
continue;
}
while(stk_pos > 0 && heights[i] < heights[stk[stk_pos-1]]){
right = i;
left = stk[stk_pos-1];
h = heights[left];
stk_pos--;
temp_pos = left;
temp = heights[left];
while(left > 0 && heights[left-1] >= temp){
if(heights[temp_pos] == heights[left-1]){
stk_pos--;
}
left--;
}
// cout << left << " " << right << " " << h << endl;
area = (right-left) * h;
area_max = area_max > area ? area_max : area;
}
}
while(stk_pos > 0){
right = i;
left = stk[stk_pos-1];
h = heights[left];
stk_pos--;
temp_pos = left;
temp = heights[left];
while(left > 0 && heights[left-1] >= temp){
if(heights[temp_pos] == heights[left-1]){
stk_pos--;
}
left--;
}
// cout << left << " " << right << " " << h << endl;
area = (right-left) * h;
area_max = area_max > area ? area_max : area;
}
return area_max;
}
};
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int v_len = heights.size();
int i, left, right, area, area_max;
area_max = 0;
for(i = 0; i < v_len; i++){
left = right = i;
while(left-1 >= 0 && heights[left-1] >= heights[i]){
left--;
}
while(right+1 < v_len && heights[right+1] >= heights[i]){
right++;
}
area = (right-left+1) * heights[i];
// cout << area << endl;
area_max = area_max > area ? area_max : area;
}
return area_max;
}
};
