###### tags: `LeetCode`,`Python3`,`Medium` # 2962. Count Subarrays Where Max Element Appears at Least K Times ### **題目連結:** [**Count Subarrays Where Max Element Appears at Least K Times**](https://leetcode.com/problems/count-subarrays-where-max-element-appears-at-least-k-times/description/?envType=daily-question&envId=2024-03-30) ### **解題方向** * 初始化: * M 存儲數組 nums 中的最大元素。 * n 是 nums 的長度。 * cnt 用於記錄當前考慮的子數組中最大元素出現的次數。 * ans 用來累加所有滿足條件的子數組的數量。 * l 作為滑動窗口的左端點。 * 遍歷數組: * 使用 r 作為滑動窗口的右端點,從左向右遍歷數組。 * 每當在位置 r 發現一個最大元素 M,cnt 就增加 1,表示當前窗口內最大元素的出現次數增加了。 * 調整左端點: * 當窗口內最大元素的出現次數 cnt 達到或超過 k 時,開始移動窗口的左端點 l,直到 cnt 再次小於 k。這是通過一個 while 迴圈實現的。如果左端點指向的是最大元素 M,則將 cnt 減 1,並將左端點 l 右移。 * 計算子數組數量: * 對於每個位置 r(即每個可能的窗口的右端點),計算有多少個以 r 為右端點的子數組滿足條件(即最大元素出現至少 k 次)。這個數量正好等於窗口的左端點 l 的位置,因為從數組的起點到 l-1 的任何位置開始的子數組,加上從 l 到 r 的部分,都將包含至少 k 個最大元素 M。 * 通過累加 l 的值到 ans,我們就能計算出所有以 r 為右端點的滿足條件的子數組數量。 ### **完整程式碼** ```python= class Solution: def countSubarrays(self, nums: List[int], k: int) -> int: M=max(nums) n=len(nums) cnt=ans=l=0 for r in range(n): if nums[r]==M: cnt+=1 while cnt>=k: if nums[l]==M: cnt-=1 l+=1 ans+=l return ans ```