设 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;}
}