求连续子数组的不同个数是k的有多少个
这个题目也是滑动窗口的思想,但是我们直接统计等于k的不太好统计。可以先统计不同数字个数 <=k的子数组有多少个,
我们记录为count(A, K)
那么答案为count(A, K) - count(A, K - 1)
求count(A, K)的话,就使用普通的滑动窗口的思想来处理就可以了
public int subarraysWithKDistinct(int[] A, int K) {
return count(A, K) - count(A, K - 1);
}
//计算连续子数组的不同元素个数<=k的有多少个
int count(int[] a, int k) {
int res = 0;
int distinct = 0;
int[] cnt = new int[20020];
int l = 0;
for (int r = 0; r < a.length; r++) {
if (++cnt[a[r]] == 1) distinct++;
while (distinct > k) {
cnt[a[l]]--;
if (cnt[a[l]] == 0) distinct--;
l++;
}
res += r - l + 1;
}
return res;
}