题目链接:2962. 统计最大元素出现至少 K 次的子数组(中等)
算法原理:
解法:滑动窗口
先找到最大值,其余做法与模板题基本一模一样👇
C.滑动窗口-求子数组个数-越长越合法------1358. 包含所有三种字符的子字符串数目(模板)
答疑
Q1:难道就不能用小贪心的方法,只用一次遍历既找到最大值又能统计窗口内最大值出现次数又能统计结果数吗?
不能,一次遍历无法完成,核心原因是:你必须先明确全局最大值才能统计包含它的子数组,而「全局最大值」需要遍历完整个数组才能确定
Java代码:
java
class Solution {
public long countSubarrays(int[] nums, int k) {
int n=nums.length;
int left=0,count=0;
long ret=0,max=0;
//先找到最大值
for(int x:nums) max=Math.max(max,x);
for(int x:nums){
//进窗口
if(x==max) count++;
//出窗口
while(count>=k){
if(nums[left]==max) count--;
left++;
}
//更新
ret+=left;
}
return ret;
}
}