LeetCode 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 大元素 | 简单 | 堆 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!