2537. 统计好子数组的数目
思路:哈希表来存储数组区间[i,j]出现的元素次数。数学公式可以推出,当一个数重复了n次,那么满足要求的数组对有n(n-1)/2个。
用双指针i,j来指出满足要求的最小区间,这里我们用for循环遍历j,在满足要求的条件下,让i尽可能的大。时间复杂度0(n),细节看注释*
class Solution {
public:
long long countGood(vector<int>& nums, int k) {
int n=nums.size();
unordered_map<int ,int>mp;
int i=0,j=0;
long long res=0,ans=0;
for(;j<n;j++){
//每次加入nums[j],都可以和原来的mp[nums[j]]组队
res+=mp[nums[j]]++;
//当res>=k时,尽可能的让i变大,这样在右边固定的情况下,左边可选择的位置就有i+1个。
while(res>=k&&res-(mp[nums[i]]-1)>=k){
res-=--mp[nums[i++]];
}
if(res>=k) ans+=i+1;
}
return ans;
}
};