找到最大的矩形,这个矩形的决定因素是最低的高,主要的思路就是将每一个数组元素作为高,得到以这个数组元素作为高的最大面积,然后找到面积的最大值。
问题来了,如何找到以这个元素为高的最大面积呢?就以问题描述中的5为例,我们要找到5左右两边离5最近的比5小的位置,左边就是1,右边就是2,然后以5为高的面积最大值就是(2的下标-1的下标-1)*5。
然后问题又来了,为什么是要找两边离5最近的比5小的值呢?因为由这两个小的值确定的矩形里面的高要么是等于5要么是大于5,所以这个区间内部就是以5为高的最大的面积。
import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] heights=new int[n];
for(int i=0;i<n;i++) {
heights[i]=sc.nextInt();
}
int maxArea = 0;
for(int i = 0; i < heights.length; i++){
//找到左边第一个小于高的位置下标
//如果left>=0并且left指向的高大于等于选定的这个高,左指针就左移
int left = i - 1;
while(left >= 0 && heights[left] >= heights[i]){
left--;
}
//找到右边第一个小于高的位置下标
//如果right小于数组长度
//并且right指向的高大于等于选定的高,右指针就右移
int right = i + 1;
while(right < heights.length && heights[right] >= heights[i]){
right++;
}
//更新面积的最大值
maxArea = Math.max(maxArea, (right - left - 1) * heights[i]);
}
System.out.println(maxArea);
}
}