思路:两个for暴力解法明显超时;考虑使用TreeSet数据结构,维护一个存放k个元素的集合,遍历时如果集合里面存在一个abs(nums[i] - nums[j]) <= t 的元素,直接返回true。不用考虑集合内放入重复元素的情况。
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int n=nums.length;
TreeSet<Long> tset=new TreeSet<>();
for(int i=0;i<n;i++){
Long ceiling=tset.ceiling((long)nums[i]-(long)t);
//判断是否存在满足条件的元素
if(ceiling!=null&&ceiling<=((long)nums[i]+(long)t)){
return true;
}
tset.add((long)nums[i]);
if(i>=k){
tset.remove((long)nums[i-k]);
}
}
return false;
}
}