描述

长度为n的数组,每次可以选择若干元素使元素的值变为这些元素的和的平均值
给出数组和数字x,求经过操作数组中最多有多少数字不小于x

示例1

输入:
3,7,[9,4,9]

返回值:
3

说明:
一开始有3个数字,分别为9,4,9,x为7,操作这3个数字后每个数字都不小于x

示例2

输入:
2,5,[4,3]

返回值:
0

说明:
一共2个数字,无论怎么操作都不会大于等于x 

思路

这道题要求的就是我要尽可能找到更多的数,计算他们的平均值,并且平均值小于 x,最后计算出符合条件的数字个数(这道题我读了半天才搞明白)。
这个还是蛮简单的,咱们只要排个序,然后从大到小遍历,挨个算平均值,大于 x 的就加入到结果中,并统计个数。

AC 代码

public int arrange (int n, int x, int[] a) {
        // write code here
        if(a == null || a.length < 1) {
            return 0;
        }
        // 对数组排序
        Arrays.sort(a);
        // 用来存储最后的结果
        int totalCount = 0;
        // 总和
        long sum = 0;
        // 如果排序后最大的那个数都小于 x, 那么之后的平均值也一定小于 x
        if (a[n - 1] < x) {
            return 0;
        }
        // 从大到小 遍历
        for (int i = n -1; i >= 0; i --) {
            // 加上当前数字的总和
            long temp = sum + a[i];
            // 加上当前数字的总个数
            int count = totalCount + 1;
            // 如果平均值大于 x, 那么当前数字符合条件,加入结果当中
            if (temp / count >= x) {
                sum = temp;
                totalCount = count;
            } else {
                // 如果平均值小于 x, 之后就不用判断了
                break;
            }
        }
        // 返回结果
        return totalCount;
    }
  • 时间复杂度:O(nlog^n),排序的时间复杂度
  • 空间复杂度:O(1),没有使用额外的空间