题解
滑动窗口
动态规划 恰好K个组成为 最多K个组成 - 最多K - 1个组成
如何计算最多K个组成:当从1个增加为2个,增加的数目为新的子数组的长度。
代码
class Solution {
public:
int GetMostDistinct(vector<int>& A, int K) {
unordered_map<int,int>mp;
int left = 0,right = 0,ret = 0;
while(right < A.size()){
mp[A[right++]]++;
while(mp.size() > K){//左指针需要右移
mp[A[left]]--;
if(mp[A[left]] == 0) mp.erase(A[left]);//如果为0即要删除这组。
left++;
}
ret = ret + right - left;
}
return ret;
}
int subarraysWithKDistinct(vector<int>&A,int K){
return GetMostDistinct(A,K) - GetMostDistinct(A,K-1);//最多由K个组成 - 最多由K - 1个组成 = 恰好由k个组成
}
};