###### 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
```