大样本统计

题目描述

我们对 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;
    }

你可能感兴趣的:(算法,算法)