【數學】B079_LC_大樣本統計(注意中位數)

一、Problem

我們對 0 到 255 之間的整數進行採樣,並將結果存儲在數組 count 中:count[k] 就是整數 k 的採樣個數。

我們以 浮點數 數組的形式,分別返回樣本的最小值、最大值、平均值、中位數和衆數。其中,衆數是保證唯一的。

我們先來回顧一下中位數的知識:

  • 如果樣本中的元素有序,並且元素數量爲奇數時,中位數爲最中間的那個元素;
  • 如果樣本中的元素有序,並且元素數量爲偶數時,中位數爲中間的兩個元素的平均值。
輸入: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]

二、Solution

方法一:中位數難求

因爲數組的個數可能是奇數/偶數(cnt 表示樣本數字的總採集次數):

  • 當 n 爲偶數時,需要求出兩個中位數 mid1、mid2,
    • 對於 mid1,如果此時數字出現總次數 cur 滿足:cur < cnt / 2 && cur + a[i] >= cnt/2
    • 對於 mid2,如果此時數字出現總次數 cur 滿足:cur < cnt / 2 +1 && cur + a[i] >= cnt/2 + 1
  • 當 n 爲奇數時,中位數直接就是數字出現總次數 cur 滿足:cur = cnt/2 + 1 時的數字。
class Solution {
    public double[] sampleStats(int[] a) {
        int n = a.length, INF = 300;
        double minv = INF, maxv = -INF, sum = 0;
        int cnt = 0;
        double mostv = 0, mostc = 0;        //衆數

        for (int i = 0; i < n; i++) {
            if (a[i] > 0) {
                maxv = Math.max(maxv, i);
                minv = Math.min(minv, i);
                sum += a[i] * i;
                cnt += a[i];
                if (mostc < a[i]) {
                    mostc = a[i];
                    mostv = i;
                }
            }
        }
        double avg = sum / cnt, mid1 = 0, mid2 = 0;
        int low = cnt / 2, hig = cnt / 2 + 1, cur = 0;

        for (int i = 0; i < n; i++) {
            if (cur < low && cur + a[i] >= low)  mid1 = i;
            if (cur < hig && cur + a[i] >= hig)  mid2 = i;
            cur += a[i];
        }
        double[] ans = new double[] {minv, maxv, avg, (mid1 + mid2) / 2, mostv};
        if (n % 2 == 1) {
            ans[3] = mid2;
        }
        return ans;
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章