Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k.
思路:
在距离当前位置为k的范围内,是否存在一个点的值与当前位置值的差的绝对值小于等于t。
题目等价可转化为,距离当前位置为k的范围内,分别在比当前点小的和大的值之中,找最接近的两个元素,如果其中一个与当前点的差绝对值不大于t,就证明存在。
对于能快速找到比一个点大或小,且最接近于当前点的数据结构,应该是二叉查找树,在JAVA中TreeSet满足这个特性。
因此我们可以维护一个大小为k的TreeSet,每次遍历到一个元素,就在TreeSet中找最接近的比它小和大的值,如果满足条件返回true。如果TreeSet的size大于k了,删除前面第i-k个元素。
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums == null || nums.length < 2 || k < 0 || t < 0) {
return false;
}
TreeSet<Integer> bst = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
Integer ge = bst.ceiling(nums[i]);
if (ge != null && ge <= nums[i] + t) {
return true;
}
Integer le = bst.floor(nums[i]);
if (le != null && le >= nums[i] - t) {
return true;
}
bst.add(nums[i]);
if (bst.size() > k) {
bst.remove(nums[i - k]);
}
}
return false;
}