Welcome to Subscribe On Youtube

1093. Statistics from a Large Sample

Description

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.

Solutions

  • class Solution {
        private int[] count;
    
        public double[] sampleStats(int[] count) {
            this.count = count;
            int mi = 1 << 30, mx = -1;
            long s = 0;
            int cnt = 0;
            int mode = 0;
            for (int k = 0; k < count.length; ++k) {
                if (count[k] > 0) {
                    mi = Math.min(mi, k);
                    mx = Math.max(mx, k);
                    s += 1L * k * count[k];
                    cnt += count[k];
                    if (count[k] > count[mode]) {
                        mode = k;
                    }
                }
            }
            double median
                = cnt % 2 == 1 ? find(cnt / 2 + 1) : (find(cnt / 2) + find(cnt / 2 + 1)) / 2.0;
            return new double[] {mi, mx, s * 1.0 / cnt, median, mode};
        }
    
        private int find(int i) {
            for (int k = 0, t = 0;; ++k) {
                t += count[k];
                if (t >= i) {
                    return k;
                }
            }
        }
    }
    
  • class Solution {
    public:
        vector<double> sampleStats(vector<int>& count) {
            auto find = [&](int i) -> int {
                for (int k = 0, t = 0;; ++k) {
                    t += count[k];
                    if (t >= i) {
                        return k;
                    }
                }
            };
            int mi = 1 << 30, mx = -1;
            long long s = 0;
            int cnt = 0, mode = 0;
            for (int k = 0; k < count.size(); ++k) {
                if (count[k]) {
                    mi = min(mi, k);
                    mx = max(mx, k);
                    s += 1LL * k * count[k];
                    cnt += count[k];
                    if (count[k] > count[mode]) {
                        mode = k;
                    }
                }
            }
            double median = cnt % 2 == 1 ? find(cnt / 2 + 1) : (find(cnt / 2) + find(cnt / 2 + 1)) / 2.0;
            return vector<double>{(double) mi, (double) mx, s * 1.0 / cnt, median, (double) mode};
        }
    };
    
  • class Solution:
        def sampleStats(self, count: List[int]) -> List[float]:
            def find(i: int) -> int:
                t = 0
                for k, x in enumerate(count):
                    t += x
                    if t >= i:
                        return k
    
            mi, mx = inf, -1
            s = cnt = 0
            mode = 0
            for k, x in enumerate(count):
                if x:
                    mi = min(mi, k)
                    mx = max(mx, k)
                    s += k * x
                    cnt += x
                    if x > count[mode]:
                        mode = k
    
            median = (
                find(cnt // 2 + 1) if cnt & 1 else (find(cnt // 2) + find(cnt // 2 + 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)}
    }
    
  • 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];
    }
    
    

All Problems

All Solutions