LeetCode 1093. 大样本统计

89 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

一、题目描述:

1093. 大样本统计 - 力扣(LeetCode)

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