有序集合+滑动窗口
import java.util.TreeSet;
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
/**
* 有序集合+滑动窗口
* 因为满足abs(nums[i] - nums[j]) <= t条件的元素都可以,因此需要使用有序集合存储遍历的元素
* 集合维持在长度为k的滑动窗口中,这样就只用考虑元素值的差
*/
TreeSet<Long> set = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
/**
* abs(nums[i] - nums[j]) <= t等价于nums[i] - t <= nums[j] <= nums[i] + t
* 即存在元素 >= nums[i] - t但不能 >= nums[i] + t,如此这个元素和nums[j]的差就会 <= t
*/
if (set.ceiling((long) nums[i] - t) != null && set.ceiling((long) nums[i] - t) <= (long) nums[i] + t){
return true;
}
set.add((long) nums[i]);
if (set.size() > k){
set.remove((long) nums[i - k]);
}
}
return false;
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/contains-duplicate-iii/