uacs2024

导航

leetcode 1838. 最高频元素的频数

1838. 最高频元素的频数

直接看题解

 

法一:滑动窗口

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        // 首先对数组进行排序,这是为了后续计算元素之间的差值时能够简化计算
        sort(nums.begin(),nums.end());
        
        int size = nums.size(), res = 1; // size是数组的大小,res用于记录当前找到的最大频率,初始化为1
        long long total = 0; // total用于记录当前操作后的数组元素之和,使用long long防止溢出
        
        // 使用双指针技巧,left指向当前考虑的区间的左边界,right指向右边界
        for(int left = 0, right = 1; right < size; ++right) {
            // 计算将right指针指向的元素加入当前区间时,总和需要增加的量
            // (nums[right] - nums[right-1])是right指向元素与前一个元素的差值,乘以(right-left)表示这个差值需要被加到多少个元素上
            total += (long long)(nums[right] - nums[right-1]) * (right-left);
            
            // 如果当前的总和超过了k,则需要通过移动left指针来减少总和,直到总和不超过k
            while(total > k) {
                total -= (nums[right] - nums[left]); // 移除left指向的元素对总和的贡献
                ++left; // 左指针右移,缩小当前考虑的区间
            }
            
            // 更新当前找到的最大频率
            res = max(res, right-left+1); // right-left+1是当前区间的长度,即当前考虑的元素频率
        }
        
        // 返回找到的最大频率
        return res;
    }
};

滑动窗口模板

# 滑动窗口模板
left,right = 0, (0 or 1)
ret = total = 0
while right < len(nums):
   更新total值
   while 窗口内数据不满足要求
      1. 更新total值
      2. 收缩左边界
   更新ret最大值
返回 ret

 

posted on 2024-12-12 17:31  ᶜʸᵃⁿ  阅读(21)  评论(0)    收藏  举报