解题思路
注:这个题目中一个很关键的条件是: 递增操作次数不能超过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;
}
}