1093. 大样本统计
难度中等28
我们对 0
到 255
之间的整数进行采样,并将结果存储在数组 count
中:count[k]
就是整数 k
在样本中出现的次数。
计算以下统计数据:
-
minimum
:样本中的最小元素。 -
maximum
:样品中的最大元素。 -
mean
:样本的平均值,计算为所有元素的总和除以元素总数。 -
median
:
- 如果样本的元素个数是奇数,那么一旦样本排序后,中位数
median
就是中间的元素。 - 如果样本中有偶数个元素,那么中位数
median
就是样本排序后中间两个元素的平均值。
- 如果样本的元素个数是奇数,那么一旦样本排序后,中位数
-
mode
:样本中出现次数最多的数字。保众数是 唯一 的。
以浮点数数组的形式返回样本的统计信息 [minimum, maximum, mean, median, mode]
。与真实答案误差在 10-5
内的答案都可以通过。
示例 1:
输入:count = [0,1,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,3.00000,2.37500,2.50000,3.00000]
解释:用count表示的样本为[1,2,2,2,3,3,3,3]。
最小值和最大值分别为1和3。
均值是(1+2+2+2+3+3+3+3) / 8 = 19 / 8 = 2.375。
因为样本的大小是偶数,所以中位数是中间两个元素2和3的平均值,也就是2.5。
众数为3,因为它在样本中出现的次数最多。
示例 2:
输入:count = [0,4,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,4.00000,2.18182,2.00000,1.00000]
解释:用count表示的样本为[1,1,1,1,2,2,3,3,3,4,4]。
最小值为1,最大值为4。
平均数是(1+1+1+1+2+2+2+3+3+4+4)/ 11 = 24 / 11 = 2.18181818…(为了显示,输出显示了整数2.18182)。
因为样本的大小是奇数,所以中值是中间元素2。
众数为1,因为它在样本中出现的次数最多。
提示:
count.length == 256
0 <= count[i] <= 109
1 <= sum(count) <= 109
count
的众数是 唯一 的
模拟(重点:求中位数)
class Solution {
public double[] sampleStats(int[] count) {
// count[k] 就是整数 k 在样本中出现的次数。
int n = 0;
int min = -1, max = -1;
double sum = 0.0;
int mode = 0, modecnt = 0;
for(int i = 0; i < count.length; i++){
if(count[i] == 0) continue;
if(min == -1) min = i;
max = i;
n += count[i];
sum += (double)i * count[i];
if(modecnt < count[i]){
modecnt = count[i];
mode = i;
}
}
// 求中位数
/**
1. 难点在于判断中位数。
2. 根据找到的数的总个数 cnt / 2 得到中位数的位置
3. 然后去count数组中找到位置为cnt/2和cnt/2 + 1这两个数
4. 判断cnt是奇数还是偶数, 然后计算出中位数
*/
double median = 0.0;
int media = n / 2;
int a = -1, b = -1; // 表示media/2 和 media/2+1 的数
// 找到media 和 media + 1这两个数
for(int i = 0; i < 256; i++){
media -= count[i];
if(media <= 0 && a == -1){
a = i;
}
if(media + 1 <= 0){
b = i;
break;
}
}
if(n % 2 == 0){
median = (double)(a+b)/2;
}else{
median = b;
}
return new double[]{min, max, sum / n, median, mode};
}
}