
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
/**
* 本题与219题仅在判断部分有改动
* 时间复杂度O(nlogn) 空间复杂度O(k)
*/
TreeSet<Long> set = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
// 需要寻找的元素是在 v-t 和 v+t 之间
// TreeSet中ceiling(E e)方法返回的是set中大于等于e的元素中最小的元素,
// floor(E e)方法返回的是set 中小于等于 e 的元素中最大的元素
// 这两个方法如果没找到返回null. 两个方法复杂度都为 O(logn)
if (set.ceiling((long)nums[i] - t) != null &&
set.ceiling((long)nums[i] - t) <= (long)nums[i] + t) {
return true;
}
/*
if (set.floor((long)nums[i] + t) != null &&
set.floor((long)nums[i] + t) >= (long)nums[i] - t) {
return true;
}
*/
set.add((long)nums[i]);
if (set.size() == k + 1) {
set.remove((long)nums[i - k]);
}
}
return false;
}
}