1+ class Solution {
2+ public:
3+ int maxFrequency (vector<int >& nums, int k, int numOperations) {
4+ sort (nums.begin (), nums.end ());
5+ int ans = 0 ;
6+ unordered_map<int , int > numCount;
7+ set<int > modes;
8+ auto addMode = [&](int value) {
9+ modes.insert (value);
10+ if (value - k >= nums.front ()) {
11+ modes.insert (value - k);
12+ }
13+ if (value + k <= nums.back ()) {
14+ modes.insert (value + k);
15+ }
16+ };
17+ int lastNumIndex = 0 ;
18+ for (int i = 0 ; i < nums.size (); ++i) {
19+ if (nums[i] != nums[lastNumIndex]) {
20+ numCount[nums[lastNumIndex]] = i - lastNumIndex;
21+ ans = max (ans, i - lastNumIndex);
22+ addMode (nums[lastNumIndex]);
23+ lastNumIndex = i;
24+ }
25+ }
26+ numCount[nums[lastNumIndex]] = nums.size () - lastNumIndex;
27+ ans = max (ans, (int )nums.size () - lastNumIndex);
28+ addMode (nums[lastNumIndex]);
29+
30+ auto leftBound = [&](int value) {
31+ int left = 0 , right = nums.size () - 1 ;
32+ while (left < right) {
33+ int mid = (left + right) / 2 ;
34+ if (nums[mid] < value) {
35+ left = mid + 1 ;
36+ } else {
37+ right = mid;
38+ }
39+ }
40+ return left;
41+ };
42+
43+ auto rightBound = [&](int value) {
44+ int left = 0 , right = nums.size () - 1 ;
45+ while (left < right) {
46+ int mid = (left + right + 1 ) / 2 ;
47+ if (nums[mid] > value) {
48+ right = mid - 1 ;
49+ } else {
50+ left = mid;
51+ }
52+ }
53+ return left;
54+ };
55+
56+ for (int mode : modes) {
57+ int l = leftBound (mode - k);
58+ int r = rightBound (mode + k);
59+
60+ int tempAns;
61+ if (numCount.count (mode)) {
62+ tempAns = min (r - l + 1 , numCount[mode] + numOperations);
63+ } else {
64+ tempAns = min (r - l + 1 , numOperations);
65+ }
66+ ans = max (ans, tempAns);
67+ }
68+
69+ return ans;
70+ }
71+ };
0 commit comments