【问题】
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000)
第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)
输出描述:
输出一个整数,表示最大的矩阵面积。
输入例子1:
6
2 1 5 6 2 3
输出例子1:
10
【解决】
② 找到左右两侧第一个比当前值小的高度,即可找到边界。此外,若要求时间复杂度为O(n),可以借助栈,在程序员代码面试指南P22页有一部分对此进行了描述。
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] height = new int[n];
for (int i = 0;i < n;i ++){
height[i] = sc.nextInt();
}
int[] dp = new int[n];
for (int i = 0;i < n;i ++){
int start = i;
int end = i;
while (start >= 0 && height[start] >= height[i]){
start --;
}
while (end < n && height[end] >= height[i]){
end ++;
}
start ++;
end --;
dp[i] = height[i] * (end - start + 1);
}
int max = 0;
for (int i = 0;i < n;i ++){
max = Math.max(dp[i],max);
}
System.out.println(max);
}
}
① 之前
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] height = new int[n];
for (int i = 0;i < n;i ++){
height[i] = sc.nextInt();
}
int maxArea = 0;
for (int i = 0;i < n;i ++){
int h = height[i];
int count = 1;
int left = i - 1;
int right = i + 1;
while (left >= 0){
if (height[left] >= h){
count ++;
left --;
}else {
break;
}
}
while (right < n){
if (height[right] >= h){
count ++;
right ++;
}else {
break;
}
}
int area = h * count;
maxArea = Math.max(area,maxArea);
}
System.out.println(maxArea);
}
}