leetcode 1838. 最高频元素的频数-滑动窗口

leetcode 1838. 最高频元素的频数-滑动窗口_第1张图片

解题思路:

  • 本题是求最大可能频数,虽然是求解最值问题,但是并不能想象成迭代子问题,所以不能利用动态规划,而题目给的数据量为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;
    }
};

你可能感兴趣的:(#,刷题-滑动窗口,算法,leetcode)