补充k次后的最高频次元素---两种滑动窗口方式解析
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补充k次后的最高频次元素---两种滑动窗口方式解析相关的知识,希望对你有一定的参考价值。
题目
直接放两张图,应该瞬间能秒懂
法一:以整个矩形的面积为目标进行收缩窗口
class Solution {
public:
typedef long long ll;
int maxFrequency(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int len = nums.size();
ll window_sum = 0;
int L = 0;
int res = 0;
for(int R=0;R<len;R++){
window_sum+=nums[R];
//收缩窗口
while((k+window_sum)<(ll)nums[R]*(R-L+1)){
//从左边开始把元素移出窗口
window_sum-=nums[L++];
}
//很明显当未收缩窗口时,都是一个满足题意的答案
res = max(res,R-L+1);
}
return res;
}
};
法二:计算上面的空白填补区域进行窗口滑动
class Solution {
public:
typedef long long ll;
int maxFrequency(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int n = nums.size();
int l = 0, ans = 1;
ll window_sum = 0;
for (int r = 1; r < n; r++) {
//计算上面的空白填补区域进行窗口滑动
window_sum += (ll)(nums[r] - nums[r - 1]) * (r - l);
while(window_sum > k) window_sum -= nums[r] - nums[l++];
ans = max(ans, r - l + 1);
}
return ans;
}
};
以上是关于补充k次后的最高频次元素---两种滑动窗口方式解析的主要内容,如果未能解决你的问题,请参考以下文章