5739 周赛 最高频元素的频数 滑动窗口双指针

排好序后用滑动窗口的思想。左标记从0开始,直到右标记无法再前进,此时让左标记前进,不断地调整框的大小,也在此过程中记录下框的大小

排序好一方面更容易获取最大值,而且也考虑了所有的可能。

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        long long window=0; //因为11行的操作  测试用例 会出现9999*9999
        int l=0;//框的左标记
        int j=1;//右标记
        int max_res=1;//结果值
        sort(nums.begin(),nums.end());
        while(j<nums.size())
        {
            window+=(long long)(nums[j]-nums[j-1])*(j-l);//可以理解为window使得现有的滑动框内的值均为nums[j-1],现在来了nums[j],那相当于每个都加一个nums[j]-nums[j-1]
            while(window>k)
            {
                window-=nums[j]-nums[l];
                l++;//左标记右移
            }
            max_res=max(max_res,j-l+1);
            j++;
        }
        return max_res;
    }
};
每天进步一点点~
原文地址:https://www.cnblogs.com/libin123/p/14700260.html