小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住
输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
1<=wi<=100000;
输入:
6
5 3 8 3 2 5
输出:
3 3 5 4 4 4
一开始想的是全部放入最大栈之后数每个位置对应的个数,但是后来发现不太对,应该是每个位置放入都要记录。
对于每个位置,用最大栈记录在这个位置向左向右比它高的建筑,由于响铃位置的建筑不论高低都能看到,所以用left,right分别记录向左向右能看到的建筑,就是前一个位置的stack大小(有加入前一个位置本身的数)
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[]num=new int[n];
int []left=new int[n];
int []right=new int[n];
Stack<Integer>stack=new Stack<Integer>();
for(int i=0;i<n;i++)
{
num[i]=in.nextInt();
left[i]=stack.size();
if(stack.isEmpty())
stack.add(num[i]);
else {
while((!stack.isEmpty()))
{
if(stack.peek()<=num[i])
stack.pop();
else break;
}
stack.add(num[i]);
}
}
stack.clear();
for(int i=n-1;i>=0;i--)
{
right[i]=stack.size();
if(stack.isEmpty())
stack.add(num[i]);
else {
while((!stack.isEmpty()))
{
if(stack.peek()<=num[i])
stack.pop();
else break;
}
stack.add(num[i]);
}
}
for(int i=0;i<n;i++)
System.out.print(left[i]+right[i]+1+" ");
}
}