LeetCode 1093. 大样本统计

题目描述

1093. 大样本统计

思路分析

解法一:一次统计(推荐)

核心思路

  • 遍历计数数组得到最小值、最大值、总数、总和与众数。
  • 中位数根据总数的中间位置,从小到大累计计数定位。
  • 注意偶数总数时取中间两数均值。


复杂度分析

  • 时间复杂度:O(256),常数级遍历。
  • 空间复杂度:O(1)。
class Solution {
    public double[] sampleStats(int[] count) {
        int min = -1;
        int max = -1;
        int mode = 0;
        long total = 0;
        long sum = 0;
        int modeCnt = 0;

        for (int i = 0; i < count.length; i++) {
            if (count[i] > 0) {
                if (min == -1) {
                    min = i;
                }
                max = i;
                total += count[i];
                sum += (long) i * count[i];
                if (count[i] > modeCnt) {
                    modeCnt = count[i];
                    mode = i;
                }
            }
        }

        double mean = (double) sum / total;

        long mid1 = (total + 1) / 2;
        long mid2 = (total + 2) / 2;
        int m1 = -1;
        int m2 = -1;
        long acc = 0;
        for (int i = 0; i < count.length; i++) {
            acc += count[i];
            if (acc >= mid1 && m1 == -1) {
                m1 = i;
            }
            if (acc >= mid2) {
                m2 = i;
                break;
            }
        }
        double median = (m1 + m2) / 2.0;

        return new double[]{min, max, mean, median, mode};
    }
}
func sampleStats(count []int) []float64 {
    minVal := -1
    maxVal := -1
    mode := 0
    total := 0
    sum := 0
    modeCnt := 0

    for i, c := range count {
        if c > 0 {
            if minVal == -1 {
                minVal = i
            }
            maxVal = i
            total += c
            sum += i * c
            if c > modeCnt {
                modeCnt = c
                mode = i
            }
        }
    }

    mean := float64(sum) / float64(total)

    mid1 := (total + 1) / 2
    mid2 := (total + 2) / 2
    acc := 0
    m1, m2 := -1, -1
    for i, c := range count {
        acc += c
        if acc >= mid1 && m1 == -1 {
            m1 = i
        }
        if acc >= mid2 {
            m2 = i
            break
        }
    }
    median := float64(m1+m2) / 2.0

    return []float64{float64(minVal), float64(maxVal), mean, median, float64(mode)}
}

相似题目

题目 难度 考察点
215. 数组中的第 K 个最大元素 中等 统计
295. 数据流的中位数 困难
347. 前 K 个高频元素 中等 统计
1093. 大样本统计 中等 统计
703. 数据流中的第 K 大元素 简单
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/41912314
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!