0
点赞
收藏
分享

微信扫一扫

【每日一题Day219】LC1093大样本统计 | 模拟

南柯Taylor 2023-06-06 阅读 53
算法

大样本统计【LC1093】

简单模拟

  • 思路

    按照定义进行模拟,难点在于平均值的越界处理和中位数的求法

    • 平均值:为了避免越界,使用long类型存储所有值之和

    • 中位数(下标从1开始)

      • 如果总个数为奇数,那么中位数为第 ⌈ n u m 2 ⌉ \lceil \frac{num}{2} \rceil 2num个数
      • 如果总个数为偶数数,那么中位数为第$ \frac{num}{2} 个和第 个和第 个和第 \frac{num}{2} + 1$个数的平均值

      因此可以使用辅助函数寻找数组中的第 i i i个数

  • 实现

    class Solution {
        int[] count;
        public double[] sampleStats(int[] count) {
            this.count = count;
            double[] res = new double[5];
            int n = count.length;
            int num = 0, maxCount = 0;
            long sum = 0;
            res[0] = 256;
            for (int i = 0; i < n; i++){
                num += count[i];
                sum += (long)i * count[i];
                if (count[i] != 0){              
                    res[0] = Math.min(res[0], i);// 最小值
                    res[1] = Math.max(res[1], i);// 最大值
                }
                if (count[maxCount] < count[i]){
                    maxCount = i;// 众数
                }
            }
            res[2] = 1.0 * sum / num;// 平均值
            res[3] = num % 2 == 1 ? find(num / 2 + 1) : (find(num / 2) + find(num / 2 + 1)) / 2.0;// 中位数
            res[4] = maxCount;// 众数    
            return res;
        }
        public int find(int index){
            int i = -1, cnt = 0;
            while (cnt < index){
                cnt += count[++i];
            }
            return i;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
      • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
举报

相关推荐

0 条评论