最小化数组极值

109 阅读1分钟

问题描述

小F手里有一个长度为nn的数组,他可以选择删除数组中的任意两个元素,并将它们的和作为一个新元素放回数组中。他最多可以进行一次这样的操作。小F的目标是使得数组的极值(即数组最大值减去最小值)尽可能小。现在你需要帮助小F计算出在最优操作下,数组能达到的最小极值。


测试样例

样例1:

输入:n = 7 ,a = [1, 4, 3, 3, 2, 2, 3]
输出:2

样例2:

输入:n = 5 ,a = [10, 5, 6, 7, 3]
输出:4

样例3:

输入:n = 4 ,a = [1, 1, 1, 1]
输出:0

他的意思就是操作后让数组的最大值和最小值的差最小,对a数组排序后可以最大值和最小值可以在他们的位置体现出来,我们只要操作最前面两个元素就行了;只要进行两次排序就可以得到答案。

import java.util.Arrays;

public class Main {
    public static int solution(int n, int[] a) {
        int i;
        for(i=1;i<n;i++){
            if(a[i]!=a[i-1]){
                break;
            }
        }
        if(i==n){
            return 0;
        }
        Arrays.sort(a);
        int[] b=new int[n-1];

        b[0]=a[0]+a[1];
        for(i=2;i<n;i++){
            b[i-1]=a[i];
        }
        Arrays.sort(b);

        return b[n-2]-b[0];
    }

    public static void main(String[] args) {
        System.out.println(solution(7, new int[]{1, 4, 3, 3, 2, 2, 3}) == 2);
        System.out.println(solution(5, new int[]{10, 5, 6, 7, 3}) == 4);
        System.out.println(solution(4, new int[]{1, 1, 1, 1}) == 0);
    }
}