滑动窗口-2962.统计最大元素出现至少k次的子数组

设 mx=max(nums)。
右端点 right 从左到右遍历 nums。遍历到元素 x=nums[right] 时,如果 x=mx,就把计数器 cntMx 加一。
如果此时 cntMx=k,则不断右移左指针 left,直到窗口内的 mx 的出现次数小于 k 为止。此时,对于右端点为 right 且左端点小于 left 的子数组,mx 的出现次数都至少为 k,把答案增加 left。
class Solution {
public long countSubarrays(int[] nums, int k) {
int mx = 0;
for(int x : nums){
mx = Math.max(mx,x);
}
long ans = 0;
int cntMx = 0,left = 0;
for(int x : nums){
if(x==mx){
cntMx++;
}
while(cntMx==k){
if(nums[left++]==mx){
cntMx--;
}
}
ans+=left;//此时left左侧所有的顺序数组加入都满足要求
}
return ans;
}
}
坚冰还盖着北海的时候,我看到了怒放的梅花。

浙公网安备 33010602011771号