1+ class Solution :
2+ def maxFrequency (self , nums : List [int ], k : int , numOperations : int ) -> int :
3+ # 排序数组,便于后续二分查找和统计连续相同元素
4+ nums .sort ()
5+
6+ # 记录最终答案:某个值能达到的最大出现频率
7+ ans = 0
8+
9+ # 统计原数组中每个数字的出现次数
10+ num_count = defaultdict (int )
11+
12+ # 候选模式集合:存储所有可能成为高频目标值的数字
13+ modes = set ()
14+
15+ def add_mode (value ):
16+ """
17+ 将value及其相关候选值加入modes集合
18+
19+ 思路:如果要让某个数字出现次数最多,有三种可能的目标值:
20+ 1. value本身
21+ 2. value - k:范围内的其他数可以通过 +k 操作变成 value
22+ 3. value + k:范围内的其他数可以通过 -k 操作变成 value
23+ """
24+ modes .add (value )
25+ # 只有当 value-k 在数组范围内时才加入
26+ if value - k >= nums [0 ]:
27+ modes .add (value - k )
28+ # 只有当 value+k 在数组范围内时才加入
29+ if value + k <= nums [- 1 ]:
30+ modes .add (value + k )
31+
32+ # 记录当前处理的相同数字的起始位置
33+ last_num_index = 0
34+
35+ # 第一次遍历:统计每个不同数字的出现次数
36+ for i in range (len (nums )):
37+ # 当遇到不同的数字时
38+ if nums [i ] != nums [last_num_index ]:
39+ # 记录前一个数字的出现次数(从last_num_index到i-1)
40+ num_count [nums [last_num_index ]] = i - last_num_index
41+ # 更新答案(不操作时的最大频率)
42+ ans = max (ans , i - last_num_index )
43+ # 将该数字及其相关候选值加入modes
44+ add_mode (nums [last_num_index ])
45+ # 更新起始位置为当前位置
46+ last_num_index = i
47+
48+ # 处理最后一组相同的数字
49+ num_count [nums [last_num_index ]] = len (nums ) - last_num_index
50+ ans = max (ans , len (nums ) - last_num_index )
51+ add_mode (nums [last_num_index ])
52+
53+ # 第二次遍历:对每个候选模式计算能达到的最大频率
54+ for mode in sorted (modes ):
55+ # 使用二分查找找到 [mode-k, mode+k] 范围内的所有元素
56+ # l: 第一个 >= mode-k 的元素位置
57+ l = bisect .bisect_left (nums , mode - k )
58+ # r: 最后一个 <= mode+k 的元素位置
59+ r = bisect .bisect_right (nums , mode + k ) - 1
60+
61+ # 计算以mode为目标值时能达到的最大频率
62+ if mode in num_count :
63+ # 情况1:mode原本就存在于数组中
64+ # 最大频率 = min(范围内总元素数, 原有数量 + 允许操作次数)
65+ temp_ans = min (r - l + 1 , num_count [mode ] + numOperations )
66+ else :
67+ # 情况2:mode不在原数组中
68+ # 最大频率 = min(范围内总元素数, 允许操作次数)
69+ # 因为每个变成mode的元素都需要一次操作
70+ temp_ans = min (r - l + 1 , numOperations )
71+
72+ # 更新全局最大值
73+ ans = max (ans , temp_ans )
74+
75+ return ans
0 commit comments