Leetcode P220 Java使用滑动窗口 + 二分搜索树解决此问题
ideas
使用二分搜索树的原因是此题我们只需要找到nums[i] - t的最小上界,二分搜索可以维护顺序性,是该题最合适的数据结构,TreeSet的ceiling方法就提供了这种功能。
使用滑动窗口的目的就是满足abs(i - j) <= k
的需求。
题意说明abs(nums[i] - nums[j]) <= t
,同时又满足 abs(i - j) <= k
。所以我们可以得知我们需要维护一个长度为K+1的滑动窗口, 我们可以得知**num[i]**的值就是大于等于 t - nums[i] 并且小于等于t + nums[i],如果我们找到了此值那么我们就找到了题目要求的数据,返回该值即可。
Long ceiiling = set.ceiling((long)nums[i] - (long)t);
if (ceiiling != null && ceiiling <= ((long)t+(long)nums[i]) ){
return true;
}
我们让要满足abs(i-j)<=k我们只需要确保set集合中最多有k+1个元素即可
set.add((long)nums[i]);
if (set.size() == k+1){
set.remove((long)nums[i-k]);
}
code
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 ceiiling = set.ceiling((long)nums[i] - (long)t);
if (ceiiling != null && ceiiling <= ((long)t+(long)nums[i]) ){
return true;
}
set.add((long)nums[i]);
if (set.size() == k+1){
set.remove((long)nums[i-k]);
}
}
return false;
}
}