forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFinding MK Average.cpp
118 lines (107 loc) · 2.99 KB
/
Finding MK Average.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
Time: addElement: O(logm) | calculateMKAverage: O(1)
Space: O(m)
Tag: TreeMap, Sorting, Queue
Difficulty: H
*/
class MKAverage {
map<int, int> left, middle, right;
queue<int> q;
int sizeofLeft, sizeofMiddle, sizeofRight;
int k;
long long mkSum;
int m;
void addToSet1(int num) {
left[num]++;
sizeofLeft++;
}
void deleteFromSet1(int num) {
left[num]--;
if (left[num] == 0) left.erase(num);
sizeofLeft--;
}
void addToSet2(int num) {
middle[num]++;
sizeofMiddle++;
mkSum += num;
}
void deleteFromSet2(int num) {
middle[num]--;
if (middle[num] == 0) middle.erase(num);
sizeofMiddle--;
mkSum -= num;
}
void addToSet3(int num) {
right[num]++;
sizeofRight++;
}
void deleteFromSet3(int num) {
right[num]--;
if (right[num] == 0) right.erase(num);
sizeofRight--;
}
public:
MKAverage(int m, int k) {
sizeofLeft = 0, sizeofMiddle = 0, sizeofRight = 0;
mkSum = 0;
this->k = k;
this->m = m;
}
void addElement(int num) {
if (sizeofLeft < k) {
addToSet1(num);
q.push(num);
} else if (sizeofMiddle < (m - (2 * k))) {
int lastEle = prev(left.end())->first;
if (num >= lastEle) {
addToSet2(num);
} else {
deleteFromSet1(lastEle);
addToSet1(num);
addToSet2(lastEle);
}
q.push(num);
} else if (sizeofRight < k) {
int last1 = prev(left.end())->first;
int last2 = prev(middle.end())->first;
if (num >= last1 && num >= last2) {
addToSet3(num);
} else if (num >= last1 && num < last2) {
deleteFromSet2(last2);
addToSet2(num);
addToSet3(last2);
} else {
deleteFromSet2(last2);
addToSet3(last2);
deleteFromSet1(last1);
addToSet2(last1);
addToSet1(num);
}
q.push(num);
} else {
int toErase = q.front();
q.pop();
int first3 = right.begin()->first;
int first2 = middle.begin()->first;
int first1 = left.begin()->first;
if (toErase >= first3) {
deleteFromSet3(toErase);
} else if (toErase >= first2) {
deleteFromSet3(first3);
deleteFromSet2(toErase);
addToSet2(first3);
} else {
deleteFromSet3(first3);
deleteFromSet2(first2);
deleteFromSet1(toErase);
addToSet1(first2);
addToSet2(first3);
}
addElement(num);
}
}
int calculateMKAverage() {
if (q.size() < m) return -1;
return mkSum / (m - (2 * k));
}
};