leetcode每日一题 P3347 执行操作后元素的最高频率 II
时间轴
2025-10-22
init
题目:
对于一个值 nums[i],我们要找 nums[i]中值处于[nums[i]-k,nums[i]+k]之间的值,这样的值通过一次 operation 就能变成目标众数。但是仅仅考虑 nums[i]是不正确的,因为 nums[i]也可以通过一次 operation 变成[nums[i]-k,nums[i]+k]之间的任何一个值作为目标众数。
那么我们还要将 num[i]待选目标众数通过一次 operation 得到的所有值都作为目标众数枚举一遍吗?答案是否定的。
核心概念
- 排序数组
nums - 每个元素的可操作区间:
[nums[i]-k, nums[i]+k] - 枚举目标众数 val → 计算能变成 val 的元素数量
定义窗口 [val-k, val+k]:
- 左边界 l:窗口包含的最左元素
- 右边界 r:窗口包含的最右元素
range_size = r - l + 1
最大频率:
关键观察
只有当窗口的左右边界 l 或 r 发生变化时,
range_size才会变化 → f_i 才可能变大
- 假设 val ∈
[nums[r]-k, nums[r+1]-k):- r 不变
- l 不变
- range_size 恒定 → f_i 不变
- 区间内部的所有 val 不会增加最大频率 → 无需枚举
临界点分析
窗口边界变化的临界点:
- 左边界 l 变化:val - k = nums[i](左边元素刚好进入/离开窗口)
- 右边界 r 变化:val + k = nums[i](右边元素刚好进入/离开窗口)
也就是说,只有当 val 等于某个 nums[i] ± k 或 nums[i] 本身,窗口边界会发生变化。
- val = nums[i] → 对应窗口覆盖 nums[i] 本身
- val = nums[i] - k → 窗口左边界刚好覆盖 nums[i]
- val = nums[i] + k → 窗口右边界刚好覆盖 nums[i]
这三个值就是 所有可能改变窗口范围的临界点
综上:我们只需要枚举边界值即可,即枚举{nums[i]-k , nums[i], num[i] +k}。
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 常想一二,不思八九!
评论



