Leetcode 992. K 个不同整数的子数组

可以将问题简化为求一次不同元素个数小于等于k和求一次不同元素个数小于等于k-1的子数组的个数,然后再做差。
求不同元素个数小于等于k的子数组的个数可以用滑动窗口来实现。
右端窗口每移动一次对答案的贡献为right-left(当前区间大小)

class Solution {
public:
    map<int ,int >mp;
    int f(vector<int >&arr,int k){
        mp.clear();
        int n=arr.size();
        int left=0;
        int right=0;
        int ans=0;
        int count=0;
        while(right<n){
            if(mp[arr[right]]==0) count++;
            mp[arr[right++]]++; 
            while(count>k){
                if(mp[arr[left]]==1) count--;
                mp[arr[left++]]--;  
            }
            ans+=right-left;//对答案的贡献,相当于[right-1,right]
            //[right-2,right],[right-3,right]----[left,right]
            
        }
        return ans;
    }
    int subarraysWithKDistinct(vector<int>& A, int K) {
        int n=A.size();
        return f(A,K)-f(A,K-1);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值