2016蘑菇街编程题:最大间隔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016蘑菇街编程题:最大间隔相关的知识,希望对你有一定的参考价值。

题目描述

给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
输入描述:
第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。
输出描述:
输出答案。
输入例子:
5
1 2 3 7 8
输出例子:
4
解题

当删除元素在原数组的最大间隔的两个元素时候最大间隔增大,当在其他位置时候,这个最大间隔不变,其他位置的间隔增加,但是在怎么增加也不会超过原始数组的最大间隔
所有删除其中一个元素的最大间隔的最小值就是原始数组的最大间隔
import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        int n,maxd=0;
        int[] A;
        while(in.hasNext()){
            n = in.nextInt();
            A = new int[n];
            for(int i =0;i<n;i++)
                A[i] = in.nextInt();
            maxd = MaxDistanceMin(A,n);
            System.out.println(maxd);
        }
    }
    public static int MaxDistanceMin(int [] A,int n){
        int maxd = -1;
        for(int i=1;i<= n -1;i++){
            maxd = Math.max(maxd,A[i] - A[i-1]);
        }
        return maxd;
    }
}
这样是不是投机取巧了
删除非元素最大间隔的两个元素,可能形成最大间隔
如:
1 3 5 8 11 12 最大间隔:3
删除3,1 5 8 11 12 最大间隔:4
删除5,1 3 8 11 12 最大间隔:5
删除8,1 3 5 11 12 最大间隔:6
删除11,1 3 5 8 12 最大间隔:4

最大间隔最小值是4,上面程序又问题,测试样例对特殊情况没有考虑
import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        int n,maxd=0;
        int[] A;
        while(in.hasNext()){
            n = in.nextInt();
            A = new int[n];
            for(int i =0;i<n;i++)
                A[i] = in.nextInt();
            maxd = MaxDistanceMin(A,n);
            System.out.println(maxd);
        }
    }
    public static int MaxDistanceMin(int [] A,int n){
        int maxd = -1;
        int minMaxd = Integer.MAX_VALUE;
        int [] d = new int[n-1];
        // 记录相邻两个元素的间隔
        for(int i=1;i<= n -1;i++){
            d[i-1] = A[i] - A[i-1];
            maxd = Math.max(maxd,d[i-1]);// 求出最大间隔 
        }
        // 间隔d 向量元素合并,当大于maxd 的时候选取最小值
        for(int i=0;i<d.length-1 ;i++){
            int subd = d[i] + d[i+1];
            if(subd> maxd){// 新的最大间隔 
                minMaxd = Math.min(minMaxd,subd);
            }else{
                minMaxd = Math.min(minMaxd,maxd);
            }
        }
        return minMaxd;
    }
}

 






以上是关于2016蘑菇街编程题:最大间隔的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 名企真题专题: 最大间隔

每日编程-20170331

3月31:蘑菇街实习笔试:求桌子达最大平衡的代价

美丽说与蘑菇街都有哪些区别

如何使用熊猫计算最大点击间隔?

方格走法 蘑菇街笔试题