最高频元素的频数
难度:
标签:
题目描述
代码结果
运行时间: 247 ms, 内存: 26.4 MB
/*
* 思路:使用Java Stream无法完全处理整个问题,因为Stream不支持有状态的操作。
* 但是可以使用Stream进行排序并收集数据,然后用传统方法处理剩下的部分。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class MaxFrequencyStream {
public int maxFrequency(int[] nums, int k) {
nums = IntStream.of(nums).sorted().toArray();
int left = 0, right = 0;
int maxFreq = 1;
long total = 0;
while (right < nums.length) {
total += nums[right];
while ((right - left + 1) * nums[right] - total > k) {
total -= nums[left];
left++;
}
maxFreq = Math.max(maxFreq, right - left + 1);
right++;
}
return maxFreq;
}
}
解释
方法:
该题解使用了滑动窗口的思路。首先对数组进行排序,然后使用两个指针l和r表示窗口的左右边界。变量s存储为了使窗口内所有元素值相同所需的总增量。窗口扩展时,若s不超过k,右指针r向右移动;若s超过k,左指针l向右移动以缩小窗口,直到s不超过k。每次移动指针时,都会更新最大频率的可能值ans。这个方法依靠排序后的数组特性,保证窗口内的值可以通过增加操作转变为窗口右端的值。
时间复杂度:
O(n log n)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中提到,为了使窗口内所有元素值相同所需的总增量s,能否具体解释一下如何计算s,以及它如何随窗口的扩展和缩小而变化?
▷🦆
在题解的代码中,为什么当s超过k时,仅通过移动左指针l来减少s,而不考虑其他可能的调整?
▷🦆
题解中的方法依赖于数组的排序。排序后,为什么可以保证通过增加操作将窗口内的值转变为窗口右端的值是最优的?
▷