可以将问题简化为求一次不同元素个数小于等于k和求一次不同元素个数小于等于k-1的子数组的个数,然后再做差。
求不同元素个数小于等于k的子数组的个数可以用滑动窗口来实现。
右端窗口每移动一次对答案的贡献为right-left(当前区间大小)
class Solution {
public:
map<int ,int >mp;
int f(vector<int >&arr,int k){
mp.clear();
int n=arr.size();
int left=0;
int right=0;
int ans=0;
int count=0;
while(right<n){
if(mp[arr[right]]==0) count++;
mp[arr[right++]]++;
while(count>k){
if(mp[arr[left]]==1) count--;
mp[arr[left++]]--;
}
ans+=right-left;//对答案的贡献,相当于[right-1,right]
//[right-2,right],[right-3,right]----[left,right]
}
return ans;
}
int subarraysWithKDistinct(vector<int>& A, int K) {
int n=A.size();
return f(A,K)-f(A,K-1);
}
};