题目:
给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。
(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。)
返回 A 中好子数组的数目。
示例 1:
输入:A = [1,2,1,2,3], K = 2
输出:7
解释:恰好由 2 个不同整数组成的子数组:[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
示例 2:
输入:A = [1,2,1,3,4], K = 3
输出:3
解释:恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].
代码:
class Solution {
public:
int subarraysWithKDistinct(vector<int>& A, int K) {
map <int,int> count1,count2;
int sum = 0 , size = A.size() , left1 = 0 , left2 = 0, right = 0;
int K2 = K;
while (right<size){
if (count1[A[right]]==0) --K;
++count1[A[right]];
if (count2[A[right]]==0) --K2;
++count2[A[right]];
while (K<0){
--count1[A[left1]];
if (count1[A[left1]]==0) ++K;
++left1;
}
while (K2<=0){
--count2[A[left2]];
if (count2[A[left2]]==0) ++K2;
++left2;
}
if (K==0 && K2==1){
//cout << left1 << " ~ " << left2 << " -> " << right << endl;
sum += left2-left1;
}
++right;
}
return sum;
}
};