给定一个正整数数组 nums和一个整数 k ,返回 num 中 「好子数组」 的数目。
如果 nums 的某个子数组中不同整数的个数恰好为 k,则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。
例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。
子数组 是数组的 连续 部分。
输入:nums = [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].
public int subarraysWithKDistinct(int[] nums, int k) {
int n = nums.length;
int[] num1 = new int[n + 1];
int[] num2 = new int[n + 1];
int tot1 = 0, tot2 = 0;
int left1 = 0, left2 = 0, right = 0;
int ret = 0;
while (right < n) {
if (num1[nums[right]] == 0) {
tot1++;
}
num1[nums[right]]++;
if (num2[nums[right]] == 0) {
tot2++;
}
num2[nums[right]]++;
while (tot1 > k) {
num1[nums[left1]]--;
if (num1[nums[left1]] == 0) {
tot1--;
}
left1++;
}
while (tot2 > k - 1) {
num2[nums[left2]]--;
if (num2[nums[left2]] == 0) {
tot2--;
}
left2++;
}
ret += left2 - left1;
right++;
}
return ret;
}