K 个不同整数的子数组

K 个不同整数的子数组



给定一个数组 ,如果 中的子数组不同数的个数为 ,则称为一个好数组,统计 中有多少个好数组.



考虑尺取.首先定义一个函数 ,表示 数组中有多少个子数组 ,满足 中不同数的个数小于等于 ,然后答案就是 .
时,定义一个 数组记录每个数出现的次数,当 这个区间不同数的个数大于 时,左指针 右移.每一次得到合法的区间 时,对答案的贡献为 .


class Solution {
public:
    int subarraysWithKDistinct(vector<int>& A, int K) {
        return f(A,K)-f(A,K-1);
    }
    int f(vector<int>&a,int K){
        int n=a.size();
        int dp[20005]={0};
        int l=0,r=0,ans=0,dis=0;
        while(r<n){
            dp[a[r]]++;
            if(dp[a[r]]==1)dis++;
            while(dis>K){
                dp[a[l]]--;
                if(!dp[a[l]])dis--;
                l++;
            }
            ans+=r-l+1;r++;
        }return ans;
    }
};
全部评论

相关推荐

牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务