持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第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,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] <= 10^9
- 1 <= sum(count) <= 10^9
- count 的众数是 唯一 的
二、思路分析:
- 注意众数的定义;
- 注意中位数的求法;
- 最小值:通过排序直接获取最小值即可,及 count[i] > 0 的最小的 i 值;
- 最大值:通过排序直接获取最大值即可,及 count[i] > 0 的最大的 i 值;
- 众位数:最大的 count[i] 所有的索引值 i;
- 平均值:统计所有的值,除以总的数目即可,注意累加溢出的问题,采用 longlong 类型记录和即可
- 中位数:如果 count 为偶数 则找到排名在 count/2、count/2+1 的 index 即可
三、AC 代码:
class Solution {
public:
int findNth(vector<int> & count,int n){
for(int i = 0; i < count.size(); ++i){
n = n - count[i];
if(n <= 0){
return i;
}
}
return 0;
}
vector<double> sampleStats(vector<int>& count) {
vector<double> ans;
int n = count.size();
long long sum = 0;
int samples = 0;
int maxCnt = 0;
double minNum = 0.0;
double maxNum = 0.0;
double average = 0.0;
double medium = 0.0;
double mode = 0.0;
for(int i = 0;i < n; ++i){
sum += count[i]*i;
if(count[i] > maxCnt){
maxCnt = count[i];
mode = i;
}
samples += count[i];
}
for(int i = 0;i < n; ++i){
if(count[i] > 0){
minNum = i;
break;
}
}
for(int i = n-1;i >= 0; --i){
if(count[i] > 0){
maxNum = i;
break;
}
}
if(samples%2 == 0){
int l1 = findNth(count,samples/2);
int l2 = findNth(count,samples/2+1);
medium = double(l1+l2)/2;
}else{
int l1 = findNth(count,samples/2+1);
medium = double(l1);
}
/*min*/
ans.push_back(minNum);
ans.push_back(maxNum);
ans.push_back(double(sum)/samples);
ans.push_back(medium);
ans.push_back(mode);
return ans;
}
};