leetcode992. K 个不同整数的子数组

好久没有遇见这一类题目了,记得很早之前遇到过一次,倒是完全忘了解法。
求整好k个情况下的答案,可以转换成求小于k和小于k-1的方法。
如果不用调用两次这个方案,按习惯我会写三个指针,一个是初始,一个是刚好等于k-1的位置,一个是等于k的位置,但是那样好像有点麻烦,不如牺牲一下时间了。

class Solution {
public:
    int subarraysWithLessthanKDistinct(vector<int>& A, int K)
    {
        int existNums[30000];
        memset(existNums, 0, sizeof(existNums));
        int curNums = 0;
        int ans = 0;
        for(int i = 0, j = 0; i < A.size(); i++)
        {
            while(curNums<=K&&j<A.size())
            {
                if(curNums==K&&!existNums[A[j]]) break;
                existNums[A[j]]++;
                if(existNums[A[j]]==1) curNums++;
                j++;
            }
            if(curNums<=K) ans+= j-i;
            existNums[A[i]]--;
            if(existNums[A[i]]==0) curNums--;
        }
        return ans;
    }
    int subarraysWithKDistinct(vector<int>& A, int K) {
        return subarraysWithLessthanKDistinct(A, K) - subarraysWithLessthanKDistinct(A, K-1);
    }
};

posted @ 2021-02-09 20:05  nanf0621  阅读(60)  评论(0)    收藏  举报