小易给定了一个长度为n的数字序列,对于每一个1<=k<=n,小易希望能够求解出所有长度为k的连续子序列的最大值的最小值。
输入描述:
第一行数字n
接下来一行是一个长度为n的数字序列
1<=n<=100000,0<=ai<=10的9次方
输出描述:
一行n个数字,第1个数字表示k=1时的答案。
示例1
输入
6
1 3 2 4 6 5
输出
1 3 3 4 6 6
package practice;
import java.util.Scanner;
public class Wangyi {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
while (in.hasNext()){
int n=in.nextInt();
int[][] record=new int[n][n];
int[] result = new int[n];
int min = (int) Math.pow(10, 9);
for(int i=0;i<n;i++){
record[i][i]=in.nextInt();
min = Math.min(min, record[i][i]);//min记录对角线上的最小值
}
result[0]=min;
for (int diff=0; diff<n-1; diff++){ //diff是坐标x和y之间的差值,能够实现沿对角线遍历
min = (int) Math.pow(10, 9);//要先给min赋值一个最大值的数
for (int i=diff;i<n-1; i++){
record[i+1][i-diff] = Math.max(record[i][i-diff],record[i+1][i-diff+1]);//record[i+1][i-diff]记录的就是子序列的最大值
min = Math.min(min, record[i+1][i-diff]);//每得到一个值就与最小值比较,保证min始终是对角线中的最小值
}
result[diff+1]=min;//每次遍历完一条对角线,将这条对角线上的最小值放到result里面
}
for(int j=0;j<n;j++)
System.out.print(result[j]);
//test(record);
}
in.close();
}
public static void test(int[][] record){
for (int each[] : record) {
for(int a : each)
System.out.print(a);
System.out.println();
}
}
}