Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A good if the number of different integers in that subarray is exactly K.
(For example, [1,2,3,1,2] has 3 different integers: 1, 2, and 3.)
Return the number of good subarrays of A.
Example 1:
Input: A = [1,2,1,2,3], K = 2
Output: 7
Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
Example 2:
Input: A = [1,2,1,3,4], K = 3
Output: 3
Explanation: Subarrays formed with exactly 3 different integers: [1,2,1,3], [2,1,3], [1,3,4].
Note:
1 <= A.length <= 20000
1 <= A[i] <= A.length
1 <= K <= A.length
class Solution:
    def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
        
        return self.at_most(A, K) - self.at_most(A, K - 1)
    
    
    def at_most(self, A, K):
        if K == 0:
            return 0
        
        window = {}
        left = 0
        ret = 0
        
        for right in range(len(A)):
            window[A[right]] = window.get(A[right], 0) + 1
            
            while left < right and len(window) > K:
                window[A[left]] -= 1
                
                if window[A[left]] == 0:
                    del window[A[left]]
                
                left += 1
            
            ret += (right - left + 1)
        
        return ret
            

class Solution:
    def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
        
        return self.at_most(A, K) - self.at_most(A, K - 1)
    
    
    def at_most(self, A, K):
        if K == 0:
            return 0
        
        window = {}
        left = 0
        ret = 0
        
        for right in range(len(A)):
            window[A[right]] = window.get(A[right], 0) + 1
            
            while left < right and len(window) > K:
                window[A[left]] -= 1
                
                if window[A[left]] == 0:
                    del window[A[left]]
                
                left += 1
            
            ret += (right - left + 1)
        
        return ret
            
