Skip to content

Count Distinct Elem

# https://www.geeksforgeeks.org/problems/count-distinct-elements-in-every-window/1
"""
Input: arr[] = [1, 2, 1, 3, 4, 2, 3], k = 4
Output:  [3, 4, 4, 3]
Explanation: Window 1 of size k = 4 is 1 2 1 3. Number of distinct elements in this window are 3.
Window 2 of size k = 4 is 2 1 3 4. Number of distinct elements in this window are 4.
Window 3 of size k = 4 is 1 3 4 2. Number of distinct elements in this window are 4.
Window 4 of size k = 4 is 3 4 2 3. Number of distinct elements in this window are 3.


        L        L        R
nums = [1, 2, 1, 3, 4, 2, 3]
        0  1  2  3  4
        # seen = (1,2,3) = len(seen) = 3
"""

from collections import defaultdict


def countDistinct(nums, k):
    freq = defaultdict(int)
    distinct = 0
    ans = []
    for i in range(k):
        if freq[nums[i]] == 0:
            distinct += 1
        freq[nums[i]] += 1

    ans.append(distinct)  # initial window answer

    for i in range(k, len(nums)):
        # remove outgoing elem nums[i-k]
        freq[nums[i - k]] -= 1
        if freq[nums[i - k]] == 0:
            distinct -= 1
        # add incoming elem nums[i]
        if freq[nums[i]] == 0:
            distinct += 1
        freq[nums[i]] += 1
        # append curr distinct count for this window
        ans.append(distinct)

    return ans


# Better Method
def countDistinct(nums, k):
    n = len(nums)
    ans = []

    # Iterate over every window
    for i in range(n - k + 1):
        seen = set()
        for j in range(i, i + k):
            seen.add(nums[j])
        ans.append(len(seen))
    return ans


def main():
    print(countDistinct(nums=[1, 2, 1, 3, 4, 2, 3], k=4))


main()