AcWing 131. 直方图中最大的矩形 - 单调栈
原题链接
简单
作者:
莫里Mori
,
2021-03-14 17:11:03
,
所有人可见
,
阅读 347
解题思路
- 求左边第一个比h[i]小的高度的下标l[i]
- 求右边第一个比h[i]小的高度的下标r[i]
- 面积 = (r[i] - l[i] - 1) * h[i]
模板
for(int i = 0; i < n; i ++){
int x = sc.nextInt();
while(!stk.isEmpty() && stk.peek() >= x){
stk.pop();
}
if(stk.isEmpty()){
System.out.println(-1);
}
else{
System.out.println(stk.peek());
}
stk.push(x);
}
代码
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
// 读取n和高度h
String[] h = br.readLine().split(" ");
int n = Integer.parseInt(h[0]);
if(n == 0){
break;
}
// 模板:求左边第一个小于nums[i]的数
// 初始化栈
Stack<Integer> stk = new Stack<>();
// 0入栈默认最左边的高度是0
stk.push(0);
int[] l = new int[n + 1];
for(int i = 1; i <= n; i ++){
int x = Integer.parseInt(h[i]);
// 如果栈不为空 且 栈顶高度大于等于栈外高度 = 出栈
// stk.peek() == 0 = 栈为空
while(stk.peek() != 0 && Integer.parseInt(h[stk.peek()]) >= x){
stk.pop();
}
l[i] = stk.peek();
stk.push(i);
}
stk.clear();
// 模板:求右边第一个小于nums[i]的数
stk.push(n + 1);
int[] r = new int[n + 1];
for(int i = n; i >= 1; i --){
int x = Integer.parseInt(h[i]);
while(stk.peek() != n + 1 && Integer.parseInt(h[stk.peek()]) >= x){
stk.pop();
}
r[i] = stk.peek();
stk.push(i);
}
long res = 0;
for(int i = 1; i <= n; i ++){
int x = Integer.parseInt(h[i]);
res = Math.max(res, (r[i] - l[i] - 1L) * x);
}
System.out.println(res);
}
}
}