本题我其实也算是坐下来了,但是用的方法在思路上也很接近标准答案,但是还是复杂了一些,写起来更容易出错。
算法:
- 设定一个
TreeSet<Long>
,来保存最近的K个数字 - 在遍历到一个新的数字的时候,寻找在
TreeSet<Long>
里面:floor()
: 比这个数字小的最大的数ceiling()
: 比这个数字大的最小的数
- 如果上面两个数存在,则意味着这两个数必然满足
index
差在K
之内这个条件 只需要看看这两个数是不是有一个跟遍历的数字差别在t以内
- 我以前想错了的是:遍历
TreeSet<Long>
里面的所有元素,其实大可不必,只需要这两个
- 我以前想错了的是:遍历
时间复杂度:
- 空间复杂度:
代码如下:
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (t < 0) {
return false;
}
TreeSet<Long> set = new TreeSet<>();
for (int i = 0; i < nums.length; ++i) {
Long num = new Long(nums[i]);
if (set.ceiling(num) != null && set.ceiling(num) - num <= t) {
return true;
}
if (set.floor(num) != null && num - set.floor(num) <= t) {
return true;
}
set.add(num);
if (i >= k) {
set.remove(new Long(nums[i-k]));
}
}
return false;
}
}