给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
我的思路是分治,找到最小的元素,能根据最大宽度求出最小元素的最大面积,然后分别对两边分治,三个元素里最大的即为所求。但是这样子的性能不大好的地方在于,每次求最小元素其实都是O(n)扫描的,其实可以用线段树优化(这里就不优化了…),这样性能就会好很多。
static const auto _=[](){
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
int get(vector<int>& vec, int l, int r)
{
if (l > r)
{
return 0;
}
if (l == r)
{
return vec[l];
}
int min = vec[l], idx = l;
for (int i = l + 1; i <= r; ++i)
{
if (vec[i] < min)
{
min = vec[i];
idx = i;
}
}
int l_ans = get(vec, l, idx - 1);
int r_ans = get(vec, idx + 1, r);
return max( max(l_ans, r_ans), min * (r - l + 1) );
}
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
return get(heights, 0, heights.size() - 1);
}
};