网易2020招聘 编程题

小易给定了一个长度为n的数字序列,对于每一个1<=k<=n,小易希望能够求解出所有长度为k的连续子序列的最大值的最小值。

输入描述:

第一行数字n

接下来一行是一个长度为n的数字序列 

1<=n<=100000,0<=ai<=10的9次方

输出描述:

一行n个数字,第1个数字表示k=1时的答案。

示例1

扫描二维码关注公众号,回复: 8759337 查看本文章

输入

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();
        }
	}

}
发布了52 篇原创文章 · 获赞 6 · 访问量 9012

猜你喜欢

转载自blog.csdn.net/PMPWDF/article/details/98607773