1.思路:使用滑动窗口+有序集合。要在找到两个元素下标之差在k内以及元素值之差在t内。可以使用一个大小为k的滑动窗口,用于保留x的前k个元素。为了判断滑动窗口内是否包含满足的元素,只需要判断滑动窗口内是否有元素落在了[x - t, x + t],更进一步,判断滑动窗口内大于等于x - t的最小元素是否小于等于x + t。为了内在集合中查找元素,使用TreeSet是很好的选择。
2.代码:
import java.util.*;
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
TreeSet<Long> set = new TreeSet();
for(int i = 0; i < nums.length; i++){
Long ceil = set.ceiling((long)nums[i] - (long)t);
if(ceil != null && ceil <= (long)nums[i] + (long)t)
return true;
set.add((long)nums[i]);
if(i >= k){
set.remove((long)nums[i - k]);
}
}
return false;
}
}
3.复杂度分析:
时间复杂度:0(nlog(min(n, k))).对于每个元素都需要在滑动窗口中查找一次。
空间复杂度:0(min(n, k))。集合最多装k + 1个元素。