面试经典单调栈进阶之java版
单调栈结构(进阶)
http://www.nowcoder.com/questionTerminal/2a2c00e7a88a498693568cef63a4b7bb
思路
单调栈:一次遍历、两次遍历
然而单调栈只能过75%,,隔壁中心扩展居然能过??????
修改输入,用buffer,90%-95%,
函数版
import java.util.*;
public class Main{
public static int[][] help(int[] in){
int[][] res=new int[in.length][2];
Stack<Integer> stack=new Stack<>();
for(int i=0;i<in.length;i++){
while(!stack.isEmpty() && in[stack.peek()]>in[i]){
int k=stack.pop();
res[k][1]=i;
}
res[i][0]=stack.isEmpty()?-1:
(in[stack.peek()]==in[i]?res[stack.peek()][0]:stack.peek());
stack.push(i);
}
while(!stack.isEmpty()){
res[stack.pop()][1] = -1;
}
return res;
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] in=new int[n];
for(int i=0;i<n;i++){
in[i]=sc.nextInt();
}
int[][] res=help(in);
for(int i=0;i<n;i++){
System.out.println(res[i][0]+" "+res[i][1]);
}
}
} 修改输入
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int[] in=Arrays.stream(reader.readLine().split(" "))
.parallel().mapToInt(Integer::parseInt).toArray();
int[][] res=new int[n][2];
Stack<Integer> stack=new Stack<>();
for(int i=0;i<n;i++){
while(!stack.isEmpty() && in[stack.peek()]>in[i]){
int k=stack.pop();
res[k][1]=i;
}
res[i][0]=stack.isEmpty()?-1:
(in[stack.peek()]==in[i]?res[stack.peek()][0]:stack.peek());
stack.push(i);
}
while(!stack.isEmpty()){
res[stack.pop()][1] = -1;
}
for(int i=0;i<n;i++){
System.out.println(res[i][0]+" "+ res[i][1]);
}
}
}
海康威视公司福利 1102人发布