import java.util.HashSet;
public class SlidingWindowFixedSize {
// Check if array contains a pair of duplicate values,
// where the two duplicates are no farther than k positions from
// eachother (i.e. arr[i] == arr[j] and abs(i - j) + 1 <= k).
// O(n * k)
public static boolean closeDuplicatesBruteForce(int[] nums, int k) {
for (int L = 0; L < nums.length; L++) {
for (int R = L + 1; R < Math.min(nums.length, L + k); R++) {
if (nums[L] == nums[R]) {
return true;
}
}
}
return false;
}
// Same problem using sliding window.
// O(n)
public static boolean closeDuplicates(int[] nums, int k) {
HashSet<Integer> window = new HashSet<>(); // Cur window of size <= k
int L = 0;
for (int R = 0; R < nums.length; R++) {
if (R - L + 1 > k) {
window.remove(nums[L]);
L++;
}
if (window.contains(nums[R])) {
return true;
}
window.add(nums[R]);
}
return false;
}
}