leetcode-统计最大元素出现至少 K 次的子数组
https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/description/
给你一个整数数组 nums 和一个 正整数 k 。
请你统计有多少满足「nums 中的最大元素」至少出现 k 次的子数组,并返回满足这一条件的子数组的数目。
子数组是数组中的一个连续元素序列。
示例 1:
输入:nums = [1,3,2,3,3], k = 2
输出:6
解释:包含元素 3 至少 2 次的子数组为:[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。
示例 2:
输入:nums = [1,4,2,1], k = 3
输出:0
解释:没有子数组包含元素 4 至少 3 次。
提示:
\(1 <= nums.length <= 10^5\)
\(1 <= nums[i] <= 106\)
\(1 <= k <= 10^5\)
class Solution {
public:
long long countSubarrays(vector<int>& nums, int k) {
int n=nums.size();
int ma=0;
for(int i=0;i<n;i++){
ma=max(ma,nums[i]);
}
vector<int> t;
for(int i=0;i<n;i++){
if(nums[i]==ma){
t.push_back(i+1);
}
}
if(t.size()<k){
return 0;
}
long long ans=0;
ans+=(t[0]-1ll)*(n-t[k-1]+1);
ans+=(n-t[k-1]+1);
cout<<ans<<endl;
int m=t.size();
for(int i=1;i<m;i++){
if((i+k-1)>=m){
break;
}
ans+=1ll*(t[i]-t[i-1])*1ll*(n-t[i+k-1]+1);
}
return ans;
}
};