Skip to content

Commit ad631c2

Browse files
committed
Time: 854 ms (54.98%), Space: 212.9 MB (54.5%) - LeetHub
1 parent 17a839c commit ad631c2

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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

Comments
 (0)