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

在这里插入图片描述

解题思路:

  • 本题是求最大可能频数,虽然是求解最值问题,但是并不能想象成迭代子问题,所以不能利用动态规划,而题目给的数据量为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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值