题目描述
这天小明买彩票中了百亿奖金,兴奋的他决定买下蓝桥公司旁的一排连续的楼房。
已知这排楼房一共有 N 栋,编号分别为 1∼N,第 i 栋的高度为 hi。
好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出 −1)。但由于楼房数量太多,小明无法用肉眼直接得到答案,于是他花了 1 个亿来请你帮他解决问题,你不会拒绝的对吧?
输入描述
第 11 行输入一个整数 N,表示楼房的数量。
第 22 行输入 N 个整数(相邻整数用空格隔开),分别为 h1,h2,...,hN,表示楼房的高度。
输出描述
输出共两行。
第一行输出 N 个整数,表示每栋楼左边第一栋比自己高的楼的编号。
第二行输出 N 个整数,表示每栋楼右边第一栋比自己高的楼的编号。
输入输出样例
示例 1
输入
5
3 1 2 5 4
输出
-1 1 1 -1 4
4 3 4 -1 -1
运行限制
最大运行时间:2s
最大运行内存: 256M
源码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Stack;
public class 百亿富翁 {
public static void main(String[] args) throws NumberFormatException, IOException {
StreamTokenizer sc=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
int n=(int)sc.nval;
int[] a=new int[n+1];
int[] l=new int[n+1];
int[] r=new int[n+1];
for (int i = 1; i < a.length; i++) {
sc.nextToken();
a[i]=(int)sc.nval;
}
Stack<Integer> stack=new Stack<Integer>();
for (int i = 1; i < a.length; i++) {
while(stack.size()!=0 && a[stack.peek()]<=a[i]) stack.pop();
if (stack.size()!=0) {
l[i]=stack.peek();
}else {
l[i]=-1;
}
stack.push(i);
}
while(stack.size()!=0) {
stack.pop();
}
for (int i = n; i > 0; i--) {
while(stack.size()!=0 && a[stack.peek()]<=a[i]) stack.pop();
if (stack.size()!=0) {
r[i]=stack.peek();
}else {
r[i]=-1;
}
stack.push(i);
}
for (int i = 1; i < l.length; i++) {
System.out.print(l[i]+" ");
}
System.out.println();
for (int i = 1; i < r.length; i++) {
System.out.print(r[i]+" ");
}
}
}
使用栈的思想来做