leetcode 1838. 最高频元素的频数
直接看题解
法一:滑动窗口
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
// 首先对数组进行排序,这是为了后续计算元素之间的差值时能够简化计算
sort(nums.begin(),nums.end());
int size = nums.size(), res = 1; // size是数组的大小,res用于记录当前找到的最大频率,初始化为1
long long total = 0; // total用于记录当前操作后的数组元素之和,使用long long防止溢出
// 使用双指针技巧,left指向当前考虑的区间的左边界,right指向右边界
for(int left = 0, right = 1; right < size; ++right) {
// 计算将right指针指向的元素加入当前区间时,总和需要增加的量
// (nums[right] - nums[right-1])是right指向元素与前一个元素的差值,乘以(right-left)表示这个差值需要被加到多少个元素上
total += (long long)(nums[right] - nums[right-1]) * (right-left);
// 如果当前的总和超过了k,则需要通过移动left指针来减少总和,直到总和不超过k
while(total > k) {
total -= (nums[right] - nums[left]); // 移除left指向的元素对总和的贡献
++left; // 左指针右移,缩小当前考虑的区间
}
// 更新当前找到的最大频率
res = max(res, right-left+1); // right-left+1是当前区间的长度,即当前考虑的元素频率
}
// 返回找到的最大频率
return res;
}
};
滑动窗口模板
# 滑动窗口模板
left,right = 0, (0 or 1)
ret = total = 0
while right < len(nums):
更新total值
while 窗口内数据不满足要求
1. 更新total值
2. 收缩左边界
更新ret最大值
返回 ret