解题思路:
- 本题是求最大可能频数,虽然是求解最值问题,但是并不能想象成迭代子问题,所以不能利用动态规划,而题目给的数据量为10^5并不能利用暴力破解,这样的话会超过限制,所以要进行一系列的优化,采用滑动窗口思想进行优化
- 注意:
1.当右边窗口向右移动时,如何计算需要的频率,以及如和更新左边界
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
if(nums.empty())return 0;
sort(nums.begin(),nums.end());
int l =0;
int res = 1;
// 当向后移动一位时,在窗口大小不变的情况下需要多增加的次数
long long total = 0;
for(int r = 1;r<nums.size();++r){
//更新需要花费的频率数量,这里是(r-l)表示需要多少个
total += (long long)(r-l)*(nums[r]-nums[r-1]);
// 不满足要求时就要一直收缩左边界
while(total > k){
//更新需要花费的频率数量
total -= nums[r]-nums[l];
++l;
}
res = max(res,r-l+1);
}
return res;
}
};