栈O(N)解法如下:
int largestRectangleArea(int* heights, int heightsSize){
int top = 0;
int max_area = 0;
int *stack_height = (int *) malloc(sizeof(int) * (heightsSize+2));
int *stack_index = (int *) malloc(sizeof(int) * (heightsSize+2));
int i = 0;
int tmp = 0;
stack_height[0] = -1;
stack_index[0] = -1;
for(i = 0; i < heightsSize; i++){
if(heights[i] > stack_height[top]){/*压栈*/
stack_height[top+1] = heights[i];
stack_index[top+1] = i;
top++;
}else if(heights[i] == stack_height[top]){ /*更新栈顶元素*/
stack_height[top] = heights[i];
stack_index[top] = i;
}else{/*出栈*/
if(max_area < stack_height[top] *(i - stack_index[top-1] - 1)){
max_area = stack_height[top] *(i - stack_index[top-1] - 1);
}
stack_height[top] = 0;
stack_index[top--] = 0;
i--;
}
}
tmp = stack_index[top];
for(; top > 0; top--){
if(max_area < stack_height[top] *(tmp - stack_index[top-1])){
max_area = stack_height[top] *(tmp - stack_index[top-1]);
}
}
return max_area;
}
暴力 O(N^2)解法如下:
int largestRectangleArea(int* heights, int heightsSize){
if(heightsSize <= 0){
return 0;
}
int i = 0, left = 0, right = 0, max_area = 0;
for(i = 0; i < heightsSize; i++){
for(left = i-1; left >= 0; left--){
if(heights[left] < heights[i]){
break;
}
}
for(right = i+1; right < heightsSize; right++){
if(heights[right] < heights[i]){
break;
}
}
if(max_area < heights[i]* (right-left-1)){
max_area = heights[i]* (right-left-1);
}
}
return max_area;
}