题目描述
我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 的采样个数。
我们以 浮点数 数组的形式,分别返回样本的最小值、最大值、平均值、中位数和众数。其中,众数是保证唯一的。
我们先来回顾一下中位数的知识:
- 如果样本中的元素有序,并且元素数量为奇数时,中位数为最中间的那个元素;
- 如果样本中的元素有序,并且元素数量为偶数时,中位数为中间的两个元素的平均值。
示例 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]
示例 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.length == 256
- 1 <= sum(count) <= 10^9
- 计数表示的众数是唯一的
- 答案与真实值误差在 10^-5 以内就会被视为正确答案
解法
直接求解即可,
求和防溢出,使用long类型
public double[] sampleStats(int[] count) {//最小值、最大值、平均值、中位数和众数int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE, numCount=0, zs=0, countMax=0;long valCount=0;double[] res = new double[5];if(count == null || count.length<1) {return res;}for(int i=0;i<count.length;i++) {if(count[i]!=0) {min = Math.min(min, i);if(count[i] > countMax) {zs = i;}max = Math.max(max, i);countMax = Math.max(countMax, count[i]);numCount+= count[i];valCount+= i*count[i];}}if(numCount%2 ==0) {int tmp=0, first=0, second=0;for(int i=0;i<count.length;i++) {if(count[i]!=0) {tmp += count[i];if(tmp>=numCount/2 && first==0) {first = i;}if(tmp>=numCount/2+1 && second==0) {second=i;}if(first!=0 && second!=0) {res[3] = (double)(first+second)/(double)2;break;}}}}else {int tmp=0;for(int i=0;i<count.length;i++) {if(count[i]!=0) {tmp += count[i];if(tmp>=numCount/2) {res[3] = i;break;}}}}res[0] = min;res[1] = max;res[2] = (double)valCount/(double)numCount;res[4] = zs;return res;}