问题描述
有一个直方图,横轴长度为n,第i列的高度为h [i]。
请你求出在这个直方图中面积最大的子矩阵。
输入格式
第一行一个正整数n。
第二行n个用空间间隔的非负整数,依次描述h [1],h [2],…,h [n]。
输出格式
输出一行一个数,表示最大面积。
样例输入
-
5
-
2 3 3 3 2
样例输出
10
数据范围
对于30%的测试点,保证n <= 4。
对于70%的测试点,保证n <= 1000。
对于所有测试点,保证n <= 50000。
保证所有h [i]不超过32767。
#include <iostream>
#include <vector>
using namespace std;
/**
方法:双指针滑动窗口
思路:从头遍历数组,求得每一个位置的值(作为高)扩展最大矩形的面积,然后不断更新最大面积的值;
1,遍历数组,定义左右指针;
2,如果左指针对应的比当前值大,那就一直左移动当前指针,直到不满足;同理,右指针对应的值比当前值大,也右移动右指针,直到不满足;
3,两指针的的距离就是长,当前位置的值为高,求得面积;
4,跟最大面积存的值比较,若大,则更新最大值;
*/
int largeS(vector<int>& arr){
int res=0;
for(int i=0;i<arr.size();i++){
int left=i-1,right=i+1;
while(left>=0 && arr[left]>=arr[i]){
left--;
}
while(right<arr.size() && arr[right]>=arr[i]){
right++;
}
int area=(right-left-1)*arr[i];
res=res>area?res:area;
}
return res;
}
int main(int argc, char *argv[])
{
vector<int> height={2,1,5,6,2,3};
int res=largeS(height);
cout<<res<<endl;
return 0;
}