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; } }