-
-
Notifications
You must be signed in to change notification settings - Fork 298
/
Copy path1093.cpp
61 lines (60 loc) · 1.91 KB
/
1093.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
__________________________________________________________________________________________________
using VI = vector< int >;
using VD = vector< double >;
class Solution {
public:
VD sampleStats( VI& cnt ){
double mind{ 256.0 }, maxd{ -1.0 }, mode{ 0.0 }, sum{ 0.0 };
const auto N = cnt.size();
auto totalCnt{ 0 }, modeCnt{ 0 };
for( auto i{ 0 }; i < N; ++i ){
if( cnt[ i ] == 0 )
continue;
if( mind > i ) mind = i;
if( maxd < i ) maxd = i;
if( modeCnt < cnt[ i ] ){
modeCnt = cnt[ i ];
mode = i;
}
sum += i * cnt[ i ];
totalCnt += cnt[ i ];
}
auto mean = sum / totalCnt;
auto median = getMedian( cnt, totalCnt );
return{ mind, maxd, mean, median, mode };
}
private:
double getMedian( const VI& cnt, int totalCnt, double median=0.0 ){
auto T1 = totalCnt / 2,
T2 = T1 + 1;
auto isEven = totalCnt % 2 == 0;
totalCnt = 0;
auto i{ 0 };
const auto N = cnt.size();
for(; i < N; ++i ){
totalCnt += cnt[ i ];
if( totalCnt >= T1 ){
median = i;
break;
}
}
if( isEven ){
if( totalCnt >= T2 ){
median += i;
median /= 2.0;
} else {
for( ++i; i < N; ++i ){
totalCnt += cnt[ i ];
if( totalCnt >= T2 ){
median += i;
median /= 2.0;
break;
}
}
}
}
return median;
}
};
__________________________________________________________________________________________________
__________________________________________________________________________________________________