题目:给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
这个题我可真是想了很久,这种用TreeSet的题之前就遇到过,但是我用别的方法也解决了。这道题就不行了。
得接收自己不会的新鲜事务,很多都是有用的。
这道题我们可以用滑动窗口来解决:
方法一:遍历数组,在一个大小为k滑动窗口中,我们找到和当前元素最相近的元素,一个是大于它的最小值,一个是小于它的最大值,如果满足则返回true。细节:溢出问题,所以都给他转成long型。
时间:O(nlogn),空间:O(k)
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
TreeSet<Long> ts = new TreeSet<>();
int l = 0, r = 0, n = nums.length;
while(r < n) {
Long u = nums[r] *1L;
if(r-l > k) {
ts.remove((long)nums[l]);
l++;
}
Long c = ts.ceiling(u);
Long f = ts.floor(u);
if(c != null && c-u <= t) return true;
if(f != null && u-f <= t) return true;
ts.add(u);
r++;
}
return false;
}
}
结果:
可见其速度并不是很快,还有第二个方法,”桶排序“
方法二:桶排序