File tree Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Original file line number Diff line number Diff line change 1+ class Solution {
2+ public:
3+ int sumOfModes(vector<int>& arr, int k) {
4+ // code here
5+ int n = arr.size();
6+
7+ //map to count frequency of each number
8+ unordered_map<int, int> mp;
9+
10+ //to hold frequency and all elements with that frequence
11+ map<int, set<int>> mp2;
12+
13+ long long ans = 0;
14+
15+ // precompute the first window
16+ for (int i = 0; i < k; i++) {
17+ int el = arr[i];
18+
19+ //always erase element i from it's previous frequency
20+ //and erase it's previous frequency if there is no remaining
21+ //element with that frequency
22+ if (mp.count(el)) {
23+ mp2[-mp[el]].erase(el);
24+ if (mp2[-mp[el]].size() == 0) mp2.erase(-mp[el]);
25+ }
26+
27+ mp[el]++;
28+ mp2[-mp[el]].insert(el);
29+ }
30+
31+ ans = abs(*mp2.begin()->second.begin());
32+
33+ // compute the next window
34+ for (int i = k; i < n; i++) {
35+ int el = arr[i];
36+
37+ if (mp[el] > 0) {
38+ mp2[-mp[el]].erase(el);
39+ if (mp2[-mp[el]].size() == 0) mp2.erase(-mp[el]);
40+ }
41+
42+ mp[el]++;
43+
44+ mp2[-mp[el]].insert(el);
45+
46+ int oldEl = arr[i - k];
47+
48+ mp2[-mp[oldEl]].erase(oldEl);
49+
50+ if (mp2[-mp[oldEl]].size() == 0) mp2.erase(-mp[oldEl]);
51+
52+ mp[oldEl]--;
53+
54+ if (mp[oldEl] > 0) mp2[-mp[oldEl]].insert(oldEl);
55+
56+ int _min = *mp2.begin()->second.begin();
57+ ans += abs(_min);
58+ }
59+
60+ return ans;
61+ }
62+ };
You can’t perform that action at this time.
0 commit comments