You are given an array of N integers, A1, A2 ,…, AN and an integer K. Return the of count of distinct numbers in all windows of size K.
Formally, return an array of size N-K+1 where i’th element in this array contains number of distinct elements in sequence Ai, Ai+1 ,…, Ai+k-1.
Note:
If K > N, return empty array.
A[i] is a signed integer
For example,
A=[1, 2, 1, 3, 4, 3] and K = 3
All windows of size K are
[1, 2, 1]
[2, 1, 3]
[1, 3, 4]
[3, 4, 3]
So, we return an array [2, 3, 3, 2].
Solution:
Time: O(n) Space: O(k)
public class Solution { public ArrayList<Integer> dNums(ArrayList<Integer> A, int B) { Map<Integer, Integer> map = new HashMap<>(); ArrayList<Integer> result = new ArrayList<>(); for (int i = 0; i < A.size(); i ++) { int val = A.get(i); int freq = map.getOrDefault(val, 0); map.put(val, freq + 1); if (i >= B) { int oldVal = A.get(i - B); map.put(oldVal, map.get(oldVal) - 1); if (map.get(oldVal) == 0) { map.remove(oldVal); } } // System.out.println(map); if (i >= B - 1) result.add(map.size()); } return result; } }