Talentd
FleetCode
Make and follow sheets.Sign in

Statistics from a Large Sample solution and explanation

MediumArrayMathProbability and Statistics7 min read43.6% acceptanceUpdated 9 Apr 2026
1093. Statistics from a Large Sample (LeetCode Weekly Contest 142)Kelvin Chandra · 4:58 · 426 viewsWatch on YouTube
9 more videos on this problem
  1. 1093. Statistics from a Large Sample (LeetCode Weekly Contest 142)Kelvin Chandra · 4:58 · 426 views
  2. Statistics from a Large Sample (Leetcode 1093)Coding Interviews · 12:39 · 268 views
  3. Leetcode 1093 Statistics from a Large SampleMath Geeks · 7:19 · 217 views
  4. 【每日一题】1093. Statistics from a Large Sample, 12/07/2019Huifeng Guan · 13:15 · 176 views
  5. LeetCode 1093 - Statistics from a Large SampleLight Of Truth · 25:27 · 175 views
  6. 1093. Statistics from a Large Sample (Leetcode Medium)Programming Live with Larry · 28:48 · 165 views
  7. Statistics From A Large Sample ||| LeetCodeSiddharth Nagaych · 15:00 · 66 views
  8. No Sound Leetcode 1093: Statistics from a Large SampleExtremeProgrammer · 3:57 · 25 views
  9. LeetCode 1093: Statistics from a Large SampleAlitaCode · 30:35 · 2 views
  10. LeetCode 1093: Statistics from a Large SampleAlitaCode · 33:08 · 1 view

The problem

You are given a large sample of integers in the range [0, 255]. Since the sample is so large, it is represented by an array count where count[k] is the number of times that k appears in the sample.

Calculate the following statistics:

  • minimum: The minimum element in the sample.
  • maximum: The maximum element in the sample.
  • mean: The average of the sample, calculated as the total sum of all elements divided by the total number of elements.
  • median:
    • If the sample has an odd number of elements, then the median is the middle element once the sample is sorted.
    • If the sample has an even number of elements, then the median is the average of the two middle elements once the sample is sorted.
  • mode: The number that appears the most in the sample. It is guaranteed to be unique.

Return the statistics of the sample as an array of floating-point numbers [minimum, maximum, mean, median, mode]. Answers within 10-5 of the actual answer will be accepted.

Example 1:

Input: 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]
Output: [1.00000,3.00000,2.37500,2.50000,3.00000]
Explanation: The sample represented by count is [1,2,2,2,3,3,3,3].
The minimum and maximum are 1 and 3 respectively.
The mean is (1+2+2+2+3+3+3+3) / 8 = 19 / 8 = 2.375.
Since the size of the sample is even, the median is the average of the two middle elements 2 and 3, which is 2.5.
The mode is 3 as it appears the most in the sample.

Example 2:

Input: 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]
Output: [1.00000,4.00000,2.18182,2.00000,1.00000]
Explanation: The sample represented by count is [1,1,1,1,2,2,2,3,3,4,4].
The minimum and maximum are 1 and 4 respectively.
The mean is (1+1+1+1+2+2+2+3+3+4+4) / 11 = 24 / 11 = 2.18181818... (for display purposes, the output shows the rounded number 2.18182).
Since the size of the sample is odd, the median is the middle element 2.
The mode is 1 as it appears the most in the sample.

Constraints:

  • count.length == 256
  • 0 <= count[i] <= 109
  • 1 <= sum(count) <= 109
  • The mode of the sample that count represents is unique.

Approach overview

Problem Overview: You are given a frequency array count[256] where each index represents a value and the element at that index represents how many times the value appears in a large dataset. From this compressed distribution, compute five statistics: minimum, maximum, mean, median, and mode.

Approach 1: Iterative Approach to Calculate Statistics (Time: O(k), Space: O(1))

The simplest solution walks through the frequency array once and reconstructs the statistical values directly from the counts. During the iteration, track the first index with a non‑zero count for the minimum and the last for the maximum. Maintain a running sum value * frequency and a total count to compute the mean. For the mode, keep the index with the highest frequency encountered so far. Median calculation requires identifying the middle position(s) in the expanded dataset, so while iterating you accumulate frequencies until the cumulative count crosses the median indices. Since the domain size is fixed (256 values), the scan is effectively constant time and uses O(1) additional memory.

Approach 2: Distribution-Based Approach with Two Pass Median Calculation (Time: O(k), Space: O(1))

This approach treats the input strictly as a probability distribution and separates the computation into two passes. The first pass computes min, max, mean, and mode by iterating through the frequency array and accumulating totals. After the total element count is known, determine the median positions depending on whether the dataset size is odd or even. A second pass walks the distribution again while maintaining a cumulative frequency until those median positions are reached. The key insight is that you never expand the dataset into an explicit array; instead, you rely on prefix frequency counts to simulate the sorted order. This keeps the algorithm efficient even when the conceptual sample size is extremely large.

The core idea across both methods is exploiting the bounded range of values. Instead of sorting millions of samples, the algorithm processes the array of counts directly and reconstructs statistics mathematically. Operations such as cumulative frequency tracking and weighted summation come directly from math and probability and statistics concepts.

Recommended for interviews: The distribution-based two-pass approach is typically what interviewers expect. It clearly shows you understand how to derive statistics from a frequency distribution without reconstructing the dataset. The single-pass iterative variant also works and demonstrates good implementation skills, but explicitly reasoning about median positions from cumulative counts highlights stronger algorithmic thinking.

Approach 1: Iterative Approach to Calculate Statistics

The iterative approach involves traversing the given frequency array from 0 to 255. This helps to determine the minimum, maximum, and gather necessary values to compute mean, median, and mode simultaneously.

def sampleStats(count):
    min_val, max_val = None, None
    total_count = sum(count)
    max_count = max(count)
    sum_vals, mode = 0, 0
    mode = count.index(max_count)
    current = 0

    for i in range(256):
        if count[i] > 0:
            if min_val is None:
                min_val = i
            max_val = i
        sum_vals += i * count[i]

    mean = sum_vals / total_count
    mid_point = total_count // 2
    is_even = total_count % 2 == 0
    mode = count.index(max(count))

    cumulative = 0
    median = 0

    for i in range(256):
        cumulative += count[i]
        if cumulative > mid_point:
            if is_even:
                if cumulative - count[i] <= mid_point:
                    median = (i + (i - 1)) / 2
                else:
                    median = i
            else:
                median = i
            break

    return [float(min_val), float(max_val), mean, float(median), float(mode)]

count = [0, 1, 3, 4, 0]
print(sampleStats(count))
import java.util.Arrays;

public class Statistics {
    public static double[] sampleStats(int[] count) {
        int minVal = -1, maxVal = -1, totalCount = 0, modeVal = -1;
        double sum = 0.0;
        int maxFrequency = 0;

        for (int i = 0; i < 256; i++) {
            if (count[i] > 0) {
                if (minVal == -1) minVal = i;
                maxVal = i;
                if (count[i] > maxFrequency) {
                    maxFrequency = count[i];
                    modeVal = i;
                }
                totalCount += count[i];
                sum += (double)i * count[i];
            }
        }

        double mean = sum / totalCount;
        double median = 0.0;
        int mid = totalCount / 2;
        int cumulative = 0;
        for (int i = 0; i < 256; i++) {
            cumulative += count[i];
            if (cumulative >= mid + 1) {
                if (totalCount % 2 == 1 || cumulative > mid) {
                    median = i;
                    break;
                }
            }
            if (cumulative >= mid && totalCount % 2 == 0) {
                median += i / 2.0;
                mid++;
            }
        }

        return new double[]{minVal, maxVal, mean, median, modeVal};
    }

    public static void main(String[] args) {
        int[] count = {0, 1, 3, 4, 0};
        System.out.println(Arrays.toString(sampleStats(count)));
    }
}
#include <iostream>
#include <vector>

std::vector<double> sampleStats(std::vector<int>& count) {
    int minVal = -1, maxVal = -1, total = 0, modeVal = -1;
    double sum = 0.0;
    
    int maxFreq = 0;
    for (int i = 0; i < 256; ++i) {
        if (count[i] > 0) {
            if (minVal == -1) minVal = i;
            maxVal = i;
            if (count[i] > maxFreq) {
                maxFreq = count[i];
                modeVal = i;
            }
            sum += i * count[i];
            total += count[i];
        }
    }

    double mean = sum / total;
    double median;
    int mid = total / 2, cumFreq = 0;
    bool isOdd = total % 2 == 1;
    int leftMiddle = -1;
    for (int i = 0; i < 256; ++i) {
        cumFreq += count[i];
        if (cumFreq > mid) {
            if (isOdd || (!isOdd && leftMiddle != -1)) {
                median = i;
                break;
            }
        }
        if (!isOdd && cumFreq == mid && leftMiddle == -1) {
            leftMiddle = i;
        }
        if (!isOdd && leftMiddle != -1 && cumFreq > mid) {
            median = (i + leftMiddle) / 2.0;
            break;
        }
    }

    return {double(minVal), double(maxVal), mean, median, double(modeVal)};
}

int main() {
    std::vector<int> count = {0, 1, 3, 4, 0};
    auto result = sampleStats(count);
    for (const double& stat : result) {
        std::cout << stat << " ";
    }
    return 0;
}
function sampleStats(count) {
    let minVal, maxVal, total = 0, modeVal = 0;
    let sum = 0;
    let maxFrequency = 0;
    for (let i = 0; i < 256; ++i) {
        if (count[i] > 0) {
            if (minVal === undefined) minVal = i;
            maxVal = i;
            if (count[i] > maxFrequency) {
                maxFrequency = count[i];
                modeVal = i;
            }
            sum += i * count[i];
            total += count[i];
        }
    }
    const mean = sum / total;
    let median, cumFreq = 0;
    const mid = Math.floor(total / 2);
    for (let i = 0; i < 256; ++i) {
        cumFreq += count[i];
        if (cumFreq > mid) {
            if (total % 2 === 1 || cumFreq - count[i] > mid) {
                median = i;
            } else {
                // in split case
                median = (i + i - 1) / 2;
            }
            break;
        }
    }
    return [minVal, maxVal, mean, median, modeVal];
}

let count = [0, 1, 3, 4, 0];
console.log(sampleStats(count));
#include <stdio.h>

void sampleStats(int* count, int countSize, double* result) {
    int minValue = -1, maxValue = -1, totalCount = 0, modeVal = -1;
    double mean = 0.0, median = 0.0, sum = 0.0;
    
    int maxFrequency = 0;
    for (int i = 0; i < countSize; i++) {
        if (count[i] > 0) {
            if (minValue == -1) minValue = i;
            maxValue = i;
            if (count[i] > maxFrequency) {
                maxFrequency = count[i];
                modeVal = i;
            }
            sum += (double)i * count[i];
            totalCount += count[i];
        }
    }
    mean = sum / (double)totalCount;
    
    int mid = totalCount / 2;
    int cumulative = 0;
    for (int i = 0; i < countSize; i++) {
        cumulative += count[i];
        if (totalCount % 2 == 0) {
            if (cumulative == mid) {
                median = (i + (i + 1)) / 2.0; // Elements between i and i+1
            } else if (cumulative > mid) {
                median = i;
                break;
            }
        } else {
            if (cumulative > mid) {
                median = i;
                break;
            }
        }
    }

    result[0] = (double)minValue;
    result[1] = (double)maxValue;
    result[2] = mean;
    result[3] = median;
    result[4] = (double)modeVal;
}

int main() {
    int count[256] = {0, 1, 3, 4, 0};
    double result[5];
    sampleStats(count, 256, result);
    for(int i = 0; i < 5; i++) {
        printf("%.5f ", result[i]);
    }
    return 0;
}
using System;

public class Solution {
    public double[] SampleStats(int[] count) {
        int minVal = -1, maxVal = -1, totalCount = 0, modeVal = -1;
        double sum = 0.0;
        int maxFrequency = 0;

        for (int i = 0; i < 256; i++) {
            if (count[i] > 0) {
                if (minVal == -1) minVal = i;
                maxVal = i;
                if (count[i] > maxFrequency) {
                    maxFrequency = count[i];
                    modeVal = i;
                }
                sum += i * count[i];
                totalCount += count[i];
            }
        }

        double mean = sum / totalCount;
        double median = 0.0;
        int mid = totalCount / 2;
        int cumulative = 0;
        for (int i = 0; i < 256; i++) {
            cumulative += count[i];
            if (totalCount % 2 == 0) { // Even
                if (cumulative >= mid && median == 0) {
                    median = i;
                }
                if (cumulative >= mid + 1 && median != 0) {
                    median = (median + i) / 2;
                    break;
                }
            } else { // Odd
                if (cumulative > mid) {
                    median = i;
                    break;
                }
            }
        }

        return new double[] { minVal, maxVal, mean, median, modeVal };
    }

    static void Main(string[] args) {
        int[] count = {0, 1, 3, 4, 0};
        var solution = new Solution();
        Console.WriteLine(string.Join(", ", solution.SampleStats(count)));
    }
}

This Python solution calculates statistics using list indices for simplicity and Python’s dynamic typing & built-in functions, such as sum() and max(), to aggregate or identify critical values.

Complexity

Time Complexity: O(N), with fixed constant operation similarity in each loop.
Space Complexity: O(1), uses several variable storages consistently.

Try this approach in the editor

Approach 2: Distribution-Based Approach with Two Pass Median Calculation

This approach is on dividing tasks into passes: A first pass supports accumulation & mean calculation; the second pass concentrates on median. Separating concerns enhances clarity.

def sampleStats(count):
    min_val, max_val = None, None
    total_count = sum(count)
    max_count = max(count)
    mode = count.index(max_count)
    current = 0
    sum_vals = 0

    for i in range(256):
        if count[i] > 0:
            if min_val is None:
                min_val = i
            max_val = i
            sum_vals += i * count[i]

    mean = sum_vals / total_count
    mid1 = (total_count - 1) // 2
    mid2 = total_count // 2

    cumulative = 0
    median = 0

    for i in range(256):
        cumulative += count[i]
        if cumulative > mid1 and mid2 >= cumulative - count[i]:
            median += i / 2.0

        if cumulative > mid2:
            median += i / 2.0
            break

    return [float(min_val), float(max_val), mean, float(median), float(mode)]

count = [0, 1, 3, 4, 0]
print(sampleStats(count))
public class Statistics {
    public static double[] sampleStats(int[] count) {
        int minVal = -1, maxVal = -1, totalCount = 0, modeVal = -1;
        double sum = 0.0;
        int maxFrequency = 0;

        // First pass: find min, max, sum, mode
        for (int i = 0; i < 256; i++) {
            if (count[i] > 0) {
                if (minVal == -1) minVal = i;
                maxVal = i;
                sum += i * count[i];
                totalCount += count[i];
                if (count[i] > maxFrequency) {
                    maxFrequency = count[i];
                    modeVal = i;
                }
            }
        }

        double mean = sum / totalCount;
        int mid1 = (totalCount - 1) / 2, mid2 = totalCount / 2, cumCount = 0;
        int medianL = -1, medianR = -1;

        // Second pass: find median
        for (int i = 0; i < 256; i++) {
            cumCount += count[i];
            if (cumCount > mid2 && medianL == -1) {
                medianR = i;
            }
            if (cumCount > mid1 && medianR == -1) {
                medianL = i;
            }
            if (medianL != -1 && medianR != -1) break;
        }

        double median = (medianL + medianR) / 2.0;
        return new double[]{minVal, maxVal, mean, median, modeVal};
    }

    public static void main(String[] args) {
        int[] count = {0, 1, 3, 4, 0};
        System.out.println(java.util.Arrays.toString(sampleStats(count)));
    }
}
#include <iostream>
#include <vector>

std::vector<double> sampleStats(const std::vector<int>& count) {
    int minVal = -1, maxVal = -1, mid1 = 0, mid2 = 0, total = 0;
    double sum = 0.0;
    int modeFreq = 0, modeVal = 0;

    for (int i = 0; i < 256; ++i) {
        if (count[i] > 0) {
            if (minVal == -1) minVal = i;
            maxVal = i;
            if (count[i] > modeFreq) {
                modeFreq = count[i];
                modeVal = i;
            }
            sum += i * count[i];
            total += count[i];
        }
    }

    double mean = sum / total;
    mid2 = (total - 1) / 2;
    mid1 = total / 2;
    int countCumulative = 0;
    int medianLeft = -1, medianRight = -1;
    for (int i = 0; i < 256; ++i) {
        countCumulative += count[i];
        if (countCumulative > mid2 && medianRight == -1) {
            medianRight = i;
        }
        if (countCumulative > mid1 && medianLeft == -1) {
            medianLeft = i;
        }
        if (medianRight != -1 && medianLeft != -1) break;
    }
    double median = (medianLeft + medianRight) / 2.0;

    return {double(minVal), double(maxVal), mean, median, double(modeVal)};
}

int main() {
    std::vector<int> count = {0, 1, 3, 4, 0};
    auto result = sampleStats(count);
    for (const double& stat : result) {
        std::cout << stat << " ";
    }
    return 0;
}
function sampleStats(count) {
    let minVal, maxVal, total = 0, modeVal = 0;
    let sum = 0;
    let maxFrequency = 0;
    for (let i = 0; i < 256; ++i) {
        if (count[i] > 0) {
            if (minVal === undefined) minVal = i;
            maxVal = i;
            if (count[i] > maxFrequency) {
                maxFrequency = count[i];
                modeVal = i;
            }
            sum += i * count[i];
            total += count[i];
        }
    }
    const mean = sum / total;
    let median, cumFreq = 0, leftMedian = 0, rightMedian = 0;
    const mid = Math.floor(total / 2);

    for (let i = 0; i < 256; ++i) {
        cumFreq += count[i];
        if (cumFreq > mid) {
            if (total % 2 === 1 || cumFreq - count[i] > mid) {
                median = i;
            } else if (leftMedian < rightMedian) {
                rightMedian = i;
            }
            break;
        } else {
            leftMedian = i;
        }
    }
    if (!median) {
        median = (leftMedian + rightMedian) / 2.0;
    }
    return [minVal, maxVal, mean, median, modeVal];
}

let count = [0, 1, 3, 4, 0];
console.log(sampleStats(count));
#include <stdio.h>

void sampleStats(int* count, int countSize, double* result) {
    int minValue = -1, maxValue = -1, totalCount = 0, modeVal = 0;
    double sum = 0.0;
    int maxFrequency = 0;

    // First pass: calculate min, max, mean, and mode
    for (int i = 0; i < countSize; ++i) {
        if (count[i] > 0) {
            if (minValue == -1) minValue = i;
            maxValue = i;
            if (count[i] > maxFrequency) {
                maxFrequency = count[i];
                modeVal = i;
            }
            sum += i * (double)count[i];
            totalCount += count[i];
        }
    }

    double mean = sum / totalCount;
    
    // Second pass: find median
    int mid1 = (totalCount - 1) / 2;
    int mid2 = totalCount / 2;
    int cumCount = 0;
    int medianL = -1, medianR = -1;
    for (int i = 0; i < countSize; ++i) {
        cumCount += count[i];
        if (cumCount > mid1 && medianL == -1) medianL = i;
        if (cumCount > mid2 && medianR == -1) {
            medianR = i;
            break;
        }
    }

    double median = (medianL + medianR) / 2.0;

    // Fill result array
    result[0] = (double)minValue;
    result[1] = (double)maxValue;
    result[2] = mean;
    result[3] = median;
    result[4] = (double)modeVal;
}

int main() {
    int count[256] = {0, 1, 3, 4, 0};
    double result[5];
    sampleStats(count, 256, result);
    for(int i = 0; i < 5; i++) {
        printf("%.5f ", result[i]);
    }
    return 0;
}
using System;

public class Solution {
    public double[] SampleStats(int[] count) {
        int minVal = -1, maxVal = -1, totalCount = 0;
        double sum = 0.0;
        int maxFrequency = 0, modeVal = -1;

        // First pass to calculate min, max, sum, and mode
        for (int i = 0; i < 256; ++i) {
            if (count[i] > 0) {
                if (minVal == -1) minVal = i;
                maxVal = i;
                if (count[i] > maxFrequency) {
                    maxFrequency = count[i];
                    modeVal = i;
                }
                sum += i * count[i];
                totalCount += count[i];
            }
        }

        double mean = sum / totalCount;

        // Second pass to calculate median
        int mid1 = (totalCount - 1) / 2;
        int mid2 = totalCount / 2;
        int cumCount = 0;
        int medianL = -1, medianR = -1;
        for (int i = 0; i < 256; ++i) {
            cumCount += count[i];
            if (cumCount > mid2 && medianR == -1) medianR = i;
            if (cumCount > mid1 && medianL == -1) medianL = i;
            if (medianL != -1 && medianR != -1) break;
        }

        double median = (medianL + medianR) / 2.0;
        return new[]{minVal, maxVal, mean, median, modeVal};
    }

    static void Main() {
        int[] count = {0, 1, 3, 4, 0};
        var result = new Solution().SampleStats(count);
        Console.WriteLine(String.Join(", ", result));
    }
}

In Python, this approach adapts by leveraging two distinct scans on the count list, one for sum and other base values, then another pass for calculating median using dynamically updated indices.

Complexity

Time Complexity: O(N), iterating precisely twice through fixed length.
Space Complexity: O(1), in maintaining active integers and floats.

Try this approach in the editor

Approach 3: Default Approach

function sampleStats(count: number[]): number[] {
    const find = (i: number): number => {
        for (let k = 0, t = 0; ; ++k) {
            t += count[k];
            if (t >= i) {
                return k;
            }
        }
    };
    let mi = 1 << 30;
    let mx = -1;
    let [s, cnt, mode] = [0, 0, 0];
    for (let k = 0; k < count.length; ++k) {
        if (count[k] > 0) {
            mi = Math.min(mi, k);
            mx = Math.max(mx, k);
            s += k * count[k];
            cnt += count[k];
            if (count[k] > count[mode]) {
                mode = k;
            }
        }
    }
    const median =
        cnt % 2 === 1 ? find((cnt >> 1) + 1) : (find(cnt >> 1) + find((cnt >> 1) + 1)) / 2;
    return [mi, mx, s / cnt, median, mode];
}
func sampleStats(count []int) []float64 {
	find := func(i int) int {
		for k, t := 0, 0; ; k++ {
			t += count[k]
			if t >= i {
				return k
			}
		}
	}
	mi, mx := 1<<30, -1
	s, cnt, mode := 0, 0, 0
	for k, x := range count {
		if x > 0 {
			mi = min(mi, k)
			mx = max(mx, k)
			s += k * x
			cnt += x
			if x > count[mode] {
				mode = k
			}
		}
	}
	var median float64
	if cnt&1 == 1 {
		median = float64(find(cnt/2 + 1))
	} else {
		median = float64(find(cnt/2)+find(cnt/2+1)) / 2
	}
	return []float64{float64(mi), float64(mx), float64(s) / float64(cnt), median, float64(mode)}
}
Try this approach in the editor

Complexity comparison

ApproachComplexity
Iterative Approach to Calculate Statistics

Time Complexity: O(N), with fixed constant operation similarity in each loop.
Space Complexity: O(1), uses several variable storages consistently.

Distribution-Based Approach with Two Pass Median Calculation

Time Complexity: O(N), iterating precisely twice through fixed length.
Space Complexity: O(1), in maintaining active integers and floats.

Default Approach–

Complexity analysis

ApproachTimeSpaceWhen to Use
Iterative Approach to Calculate StatisticsO(k)O(1)General solution when scanning the frequency array once and computing all statistics together.
Distribution-Based Two Pass Median CalculationO(k)O(1)Preferred when reasoning about median positions from cumulative frequencies in a statistical distribution.

Frequently asked questions

Is Statistics from a Large Sample easy or hard?

The problem is rated Medium because the statistical formulas are simple but the challenge is computing them from a compressed frequency array. Understanding cumulative counts for median calculation and weighted averages for the mean is the key difficulty.

Statistics from a Large Sample Python/Java solution

Python, Java, C++, and other implementations follow the same idea: iterate through the count array, compute min and max from non-zero entries, accumulate value*frequency for the mean, track the largest frequency for the mode, and find the median using cumulative counts.

How to solve Statistics from a Large Sample in O(n)?

Treat the input as a frequency distribution instead of expanding it into a full array. Iterate through the count array, accumulate total elements and weighted sums for the mean, track the highest frequency for the mode, and use cumulative counts to locate median indices. This avoids sorting or reconstruction and completes in O(k) time.

What is the best approach for Statistics from a Large Sample?

The distribution-based scan of the frequency array is the most practical approach. Instead of reconstructing the dataset, iterate over the 256-length count array and compute min, max, mean, and mode directly while using cumulative frequencies to locate the median. This runs in O(k) time where k is the value range (256) and uses O(1) extra space.

Is Statistics from a Large Sample asked at Google/Amazon/Meta?

Frequency distribution and statistics problems appear in interviews at large tech companies because they test understanding of arrays, cumulative counts, and mathematical reasoning. Variants of this problem have appeared in interview prep lists for companies like Google and Amazon, especially in data processing or analytics-focused roles.

What data structure is used in Statistics from a Large Sample?

The primary structure is a fixed-size frequency array where each index represents a value and the stored number represents its occurrence count. Algorithms operate on cumulative frequencies, weighted sums, and simple iteration over the array.

What is the time complexity of Statistics from a Large Sample?

The optimal solution runs in O(k) time where k is the size of the frequency array (256). Since the value range is fixed, the algorithm is effectively constant time relative to the conceptual dataset size. Space complexity is O(1) because only a few numeric variables are stored.

Comments

Now write it yourselfClose this page and solve Statistics from a Large Sample in the editor, without looking.
Practise Statistics from a Large Sample