4.2美团笔试1不能超过

不能超过

时间限制:C/C++语言 1000MS;其余语言 3000MS
内存限制:C/C++语言 65536KB;其余语言 589824KB
题目描述:
给出一个序列包含n个正整数的序列A,你能够从中删除若干个数,使得剩下的数字中的最大值和最小值之差不超过x,请问最少删除多少个数字。java

输入
输入第一行仅包含两个正整数n和x,表示给出的序列的长度和给定的正整数。(1<=n<=1000,1<=x<=10000)web

接下来一行有n个正整数,即这个序列,中间用空格隔开。(1<=a_i<=10000)数组

输出
输出仅包含一个正整数,表示最少删除的数字的数量。svg

样例输入
5 2
2 1 3 2 5
样例输出
1大数据

提示:极端状况下,当删除到仅剩1个数时,最大值和最小值的差为0,故不会出现无解的状况。spa

作题时思路

贪心思想模拟人为删除
使用Arrays.sort()将输入数组排序,而后每次删掉数组头尾中与数组中位数相差较大的那个,count++,直至数组头尾之差不超过xcode

作题时问题

刚开始想用平均数,计算sum时误将sum类型声明为了int,遇到大数据时会溢出。xml

代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] nx = br.readLine().split(" ");
        int n = Integer.parseInt(nx[0]);
        int x = Integer.parseInt(nx[1]);
        int count = 0;
        String[] input = br.readLine().split(" ");
        int[] nums = new int[n];
        for (int i = 0; i <n ; i++) {
            nums[i] = Integer.parseInt(input[i]);
        }

        Arrays.sort(nums);
        int max = nums[n-1];
        int min = nums[0];
        int avg = n/2;
        if (max-min <= x){
            System.out.print(count);
        } else {
            delete(nums,0 ,n-1, x,avg,count);
        }
    }

    private static void delete(int[] nums, int start, int end, int x,int avg, int count) {
        while (nums[end]-nums[start]>x){
            int chaMax = nums[end] - nums[avg];
            int chaMin = nums[avg] - nums[0];
            if (chaMax>chaMin){
                end--;
            } else {
                start++;
            }
            count++;
            avg = (start+end)/2;
        }
        System.out.print(count);
    }
}