描述
长度为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),没有使用额外的空间