leetcode1838. 最高频元素的频数

原题链接:https://leetcode-cn.com/problems/frequency-of-the-most-frequent-element/

题意:

元素的 频数 是该元素在一个数组中出现的次数。

给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。

执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。

方法:滑动窗口,先将数组从小到大排序,用k值填补滑动窗口中所有的空缺(滑动窗口中中每个数与滑动窗口最右侧的数的差值就是空缺) ,每次都比较与当前最大长度的大小,返回最大的长度,就是最大可能频数

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int maxn = 0;//滑动窗口最大长度
        int left=0,right=0,len=nums.size();//滑动窗口左侧坐标,滑动窗口右侧坐标,滑动窗口的长度
        long long sum = 0;//滑动窗口的大小。
        while(right<len)
        {
            long long tmp = (long long)(right-left+1)*nums[right];//存储滑动窗口最右侧元素乘以滑动窗口长度,也就是整个滑动窗口的面积
            sum+=nums[right]; //存储滑动窗口中各个元素的面积和
            while(tmp-sum>k)//滑动窗口面积减去各个元素的面积和用k来填补,k不够补,滑动窗口的左侧就进位
            {
                sum-=nums[left];//进位时更新各个元素的面积和
                tmp-=nums[right];//更新滑动窗口的总面积
                left++;//滑动窗口左侧坐标往右移动
            }
            maxn = max(maxn,right-left+1);//更新最大长度
            right++;//滑动窗口右侧坐标往右滑动
        }
        return maxn;//返回最大长度
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值