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.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
分析:暴力搜索,对于每一个 i 搜索最大宽度,时间复杂度O(n^2)。
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int len = height.size();
int ret = 0;
for(int i = 0; i < len; i++) {
if(i != 0 && height[i] == height[i - 1]) continue; //去重
int count = 1;
int left = i - 1;
int right = i + 1;
while(left >= 0 && height[left] >= height[i]) {
left--;
count++;
}
while(right < len && height[right] >= height[i]) {
right++;
count++;
}
int tmp = height[i] * count;
ret = max(ret, tmp);
}
return ret;
}
};
逆向迭代,时间复杂度O(n^2)依然很高
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int len = height.size();
if(len == 0) return 0;
int ret = height[len - 1];
for(int i = len - 2; i >= 0; i--) {
int width = 1;
int right = i + 1;
while(i + 1 < len && height[right] >= height[i]) {
width++;
right++;
}
int tmp = height[i] * width;
ret = max(ret, tmp);
}
return ret;
}
};