描述
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
分析
暴力方法会超时O(n*k)
- 使用TreeSet得到距离当前元素最近的两个元素,进而判断是否存在元素使得abs(nums[i] - nums[j]) <= t。
- 和219. 存在重复元素 II一样,通过判断元素是否在Set中,来得知是否满足abs(i - j) <= k。 set的size需要动态维护,一直保持在k+1。
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
TreeSet<Long> rb = new TreeSet<>();
for(int i = 0; i < nums.length; i++){
long num = nums[i] * 1L;
Long ceiling = rb.ceiling(num);
Long floor = rb.floor(num);
if(ceiling != null && Math.abs(ceiling - num) <= t){
return true;
}
if(floor != null && Math.abs(floor - num) <= t){
return true;
}
rb.add((long)nums[i]);
if(rb.size() == k + 1){
rb.remove((long)nums[i - k]);
}
}
return false;
// for(int i = 0; i < nums.length; i++){
// for(int j = i - 1; j >= Math.max(0,i - k); j--){
// // long subtract = Math.abs(nums[i]-nums[j]);
// long subtract = Math.abs((long)nums[i]-(long)nums[j]);
// if(subtract <= t){
// return true;
// }
// }
// }
// return false;
}
}