Problem:
Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k.
Analysis:
This problem has three method.
method 1
naive method. simplify use two for loop to check each pair of Integer.
time complexity O(kn)
space complexity O(1)
method 2
Using HashMap to record <nums[I], I> pairs. when meeting the same number, check whether it satisfies j - I <= k
time complexity O(n)
space complexity O(n)
method3
Using HashSet to check whether the next number is contained in the set which size is k.
public class Solution1 {
// sliding window
public boolean containsNearbyDuplicate(int[] nums, int k) {
TreeSet<Integer> set = new TreeSet<>();
for (int i=0; i<nums.length; i++) {
if (set.contains(nums[i])) {
return true;
}else {
set.add(nums[i]);
}
if (i >= k ) {
set.remove(nums[i-k]);
}
}
return false;
}
// HashMap
public boolean containsNearbyDuplicate1(int[] nums, int k) {
if (nums == null || nums.length == 0 || k <=0 ) return false;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i=0; i<nums.length; i++) {
Integer j = map.get(nums[i]);
if (j != null && i - j <= k) {
return true;
}
map.put(nums[i], i);
}
return false;
}
}