给定正整数数组nums[n]和一个整数k,返回nums中好子数组的数目。如果nums的某个连续子数组中不同的整数个数恰好为k,则称其为好数组。
1<=n<=2e4; 1<=nums[i],k<=n
先将问题做下转化:恰好为k的个数 = 最多为k的个数 - 最多为k-1的个数。而最多为k的个数可以用双指针来解决,固定L并不断往右延升R,每次得到可行的R时,计算[L,R]内以R为终点的区间个数,并累加到答案。
class Solution {
public:
int subarraysWithKDistinct(vector<int>& nums, int k) {
auto get = [&](int d) {
if (d <= 0) return 0;
int ans = 0;
int n = nums.size();
map<int,int> cnt;
int L, R;
for (L = 0, R = 0; R < n; R++) {
if (cnt.size() < d || cnt.count(nums[R])) {
cnt[nums[R]] += 1;
ans += R - L + 1;
} else {
if (--cnt[nums[L]] == 0) {
cnt.erase(nums[L]);
}
L += 1;
R -= 1;
}
}
return ans;
};
return get(k) - get(k-1);
}
};
标签:lc992,cnt,nums,int,get,个数,整数,数组
From: https://www.cnblogs.com/chenfy27/p/18090555