Problem: 1838. 最高频元素的频数
思路
滑动窗口
解题过程
首先需要对数组进行排序,为什么呢?
排序后,相邻元素的差值变得有序,可以高效地计算将窗口内所有元素变为右端点值所需的总操作次数。
排序后,我们需要维护一个窗口,这个窗口[L,R]的含义是窗口内所有的值都变为右端点的值,且操作次数不大于k。此时我们就可以更新最大窗口长度,得到最终结果。
在计算[L,R]时,已知[L,R-1]的操作次数,且nums[L,R-1]的值都为nums[R-1],此时需要将其中所有值都变为nums[R],增加的操作数是(nums[R]-nums[R-1])*(R-L)。再判断是否超过了k,如果超过,L需要向右移动,缩小窗口。
code
c++
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
int l = 0;
int ans = 1;
int n = nums.size();
ranges::sort(nums);
long long s = 0;
for (int r = 1; r < n; r++) {
s += (long long)(nums[r] - nums[r - 1]) * (long long)(r - l);
if (s > k) {
s -= nums[r] - nums[l];
l++;
}
ans = max(ans, r - l + 1);
}
return ans;
}
};
python
class Solution:
def maxFrequency(self, nums: List[int], k: int) -> int:
l = 0
ans = 1
s = 0
n = len(nums)
nums.sort()
for r in range(1,n):
s += (nums[r]-nums[r-1]) * (r-l)
if(s > k):
s -= nums[r] -nums[l]
l += 1
ans = max(ans, r - l + 1)
return ans
复杂度
- 时间复杂度: O(nlogN)
- 空间复杂度: O(1)

1万+

被折叠的 条评论
为什么被折叠?



