lc992 K个不同整数的子数组

给定正整数数组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);
    }
};
posted @ 2024-03-22 22:48  chenfy27  阅读(3)  评论(0编辑  收藏  举报