LeetCode1838 最高频元素的频数

解题思路

注:这个题目中一个很关键的条件是: 递增操作次数不能超过k
睿智版小学生找规律
上菜: [1,2,4,8] 11
首先: left = 0 ,right = 1, 操作次数moveCount = 2 - 1
注意我的操作,大家动动脑筋
我假定数组变为[2,2,4,8]

[2,2]为当前滑动窗口

接下来:
left = 0; right = 2,操作次数moveCount += (4 - 2) * 2 = 5;
(4 - 2)解释 nums[1] = 2递增到nums[2] = 4需要递增两次,nums[right] - nums[right - 1]
那么为什么要乘以2,因为nums[0]这个值也需要递增两次
所以这四次就是 2 * 2;
总移动次数是 1 + 2 * 2 = 5
可能大家会很疑惑,难道不是1->4 为3, 2->4为2, 3 + 2 = 5吗;
这样的时间复杂度就很高,因为需要遍历当前left到right,求和sum += nums[right] - nums[left]
所以采用:
nums[0] = 1->2 是递增1次,然后已经递增过一次了,我就把这个1看成2
[2,2,4,8] nums[0],nums[1]值一样的,要变为4
每次递增次数自然是 (nums[2] - nums[1]) * (2 - 0)了
也就是(nums[right] - nums[right - 1]) * (right - left)
数组假定为[4,4,4,8]
滑动窗口为[4,4,4]

后面就容易一点了
left = 0, right = 3,操作次数为moveCount += (8 - 4) * (3 - 0) = 17 > 11
操作次数超了,我们移动滑动窗口左侧
left++;left = 1,
自然操作次数要减去7次,7次从哪里来8 - 1 = 7;也就是nums[right] - nums[left];
moveCount -= nums[right] - nums[left];

当前滑动窗口为[1,8,8,8]

代码

class Solution {
    public int maxFrequency(int[] nums, int k) {
        Arrays.sort(nums);
        int left = 0;
        int len = nums.length;
        int moveCount = 0;
        int res = 1;
        for (int right = 1; right < len; right++) {
            moveCount += (nums[right] - nums[right - 1]) * (right - left);
            while (moveCount > k) {
                moveCount -= nums[right] - nums[left];
                left++;
            }
            res = Math.max(res, right - left + 1);
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值