思路
ans= 子数组满足不重复数字的数量小于等于K的 - 子数组中满足不重复数字的数量小于K-1的
假设下标为 i到j 的子数组,满足不重复数字的数量等于K,则以 i开始j结束的数组的子数组数量是j-i+1。
步骤:
- j 往后走,如果满足是新的数字(备忘录里没有),res++并备忘录存起来为1,如果有的话备忘录里面的数字加1。
- res<=K,ans+=j-i+1;
- res>K,i 往后走,直到res=K
- 最后的结果返回getRes(A,K)-getRes(A,K-1)
class Solution {
public:
int subarraysWithKDistinct(vector<int>& A, int K) {
return getRes(A,K)- getRes(A,K-1);
}
int getRes(vector<int> &A,int K){
unordered_map<int,int> memo;//memo表示当前窗口的字符对应的数量是多少
int res=0;
int ans=0;
for(int i=0,j=0;j<A.size();j++){
if(memo.find(A[j])==memo.end()||memo[A[j]]==0){
res++;
memo[A[j]]=1;
}
else
memo[A[j]]++;//查看并记录当前节点,是否为新节点,新节点里面的数量加1
while(i<j&&res>K){
if(memo[A[i]]==1){
res--;
}
memo[A[i]]--;
i++;
}//左边界向后走
if(res<=K)
ans+=j-i+1;//保存记录
}
return ans;
}
};