原题链接:https://leetcode-cn.com/problems/frequency-of-the-most-frequent-element/
题意:
元素的 频数 是该元素在一个数组中出现的次数。
给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。
执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。
方法:滑动窗口,先将数组从小到大排序,用k值填补滑动窗口中所有的空缺(滑动窗口中中每个数与滑动窗口最右侧的数的差值就是空缺) ,每次都比较与当前最大长度的大小,返回最大的长度,就是最大可能频数
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int maxn = 0;//滑动窗口最大长度
int left=0,right=0,len=nums.size();//滑动窗口左侧坐标,滑动窗口右侧坐标,滑动窗口的长度
long long sum = 0;//滑动窗口的大小。
while(right<len)
{
long long tmp = (long long)(right-left+1)*nums[right];//存储滑动窗口最右侧元素乘以滑动窗口长度,也就是整个滑动窗口的面积
sum+=nums[right]; //存储滑动窗口中各个元素的面积和
while(tmp-sum>k)//滑动窗口面积减去各个元素的面积和用k来填补,k不够补,滑动窗口的左侧就进位
{
sum-=nums[left];//进位时更新各个元素的面积和
tmp-=nums[right];//更新滑动窗口的总面积
left++;//滑动窗口左侧坐标往右移动
}
maxn = max(maxn,right-left+1);//更新最大长度
right++;//滑动窗口右侧坐标往右滑动
}
return maxn;//返回最大长度
}
};