补充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次后的最高频次元素---两种滑动窗口方式解析的主要内容,如果未能解决你的问题,请参考以下文章

[M贪心] lc1838. 最高频元素的频数(前缀和+二分+双指针+滑动窗口+周赛238_2)

字符串类题目——滑动窗口和递归分治以及一些些位运算的结合

存在重复元素III--滑动窗口+有序数据结构的二分运用

滑动窗口/模板单调队列 题解

滑动窗口解乘积小于K的子数组

Java 求解滑动窗口最大值