一、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;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,