题目

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

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

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

示例 1:

1
2
3
4
输入:nums = [1,2,4], k = 5
输出:3
解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。
4 是数组中最高频元素,频数是 3 。

示例 2:

1
2
3
4
5
6
输入:nums = [1,4,8,13], k = 5
输出:2
解释:存在多种最优解决方案:
- 对第一个元素执行 3 次递增操作,此时 nums = [4,4,8,13] 。4 是数组中最高频元素,频数是 2 。
- 对第二个元素执行 4 次递增操作,此时 nums = [1,8,8,13] 。8 是数组中最高频元素,频数是 2 。
- 对第三个元素执行 5 次递增操作,此时 nums = [1,4,13,13] 。13 是数组中最高频元素,频数是 2 。

示例 3:

1
2
输入:nums = [3,9,6], k = 2
输出:1

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105
  • 1 <= k <= 105

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int maxFrequency(int[] nums, int k) {
int n=nums.length;
Arrays.sort(nums);
int ans=1;
long count=0;
for(int right=1,left=0;right<n;right++){
count+=(long)(nums[right]-nums[right-1])*(right-left);
while(count>k&&left<=right){
count-=nums[right]-nums[left];
left++;
}

ans=Math.max(ans,right-left+1);

}
return ans;
}
}

知识点

题目翻译:求一个数组中,如何使用给定的次数k,将数组中某些元素执行k次的加1操作,使得数组中相同元素尽可能地多。结果要的是这个元素的频数。

应当对【离我们选定的最高频元素最近的元素】进行加1操作。这个最近指的是,差值最近。经过排序后,也就是距离最近。

再次翻译题目:如何在有限的k次操作中,尽可能多的让某个区间中的值相等,求这个最长区间的长度。使用滑动窗口。

操作数的计算公式:count += (long)(nums[right] - nums[right - 1]) * (right - left);注意:这里需要强制转换为long,不然会溢出有样例过不了。

图解如下:

image-20240924110255147