Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i]
and nums[j]
is at most t and the difference between i and j is at most k.
Binary Search Tree Solution
Reference Link
We can use the idea—Binary Search Tree whose size is k to solve this problem!
Time Complexity Analysis
We know that maintaining a BST of size k is a time complexity of lg(K).
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums == null || nums.length == 0 || k <= 0) {
return false;
}
final TreeSet<Integer> values = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
final Integer floor = values.floor(nums[i] + t);
final Integer ceil = values.ceiling(nums[i] - t);
// Thanks to the method that floor() and ceiling()
if ((floor != null && floor >= nums[i]) || (ceil != null && ceil <= nums[i])) return true; //key idea!
values.add(nums[i]);
// make sure that the size of BST is k
if (i >= k)
values.remove(nums[i - k]);
}
return false;
}
}
The link below is the same idea as Binary Search Tree!