滑动窗口-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;
    }
}
posted @ 2025-03-17 13:04  Zero&&One  阅读(47)  评论(0)    收藏  举报