Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.
Java:
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
TreeSet<Integer> treeset = new TreeSet<Integer>();
for(int i=0; i< nums.length; i++)
{
if(!treeset.isEmpty())
{
if(treeset.floor(nums[i]) != null && nums[i] <= treeset.floor(nums[i])+t)
return true;
else if(treeset.ceiling(nums[i]) != null && treeset.ceiling(nums[i]) - nums[i]<=t)
return true;
//find the highest value inside the set that is less than nums[i] or the smallest value bigger than nums[i]
}
treeset.add(nums[i]);
if(i>=k)
{
treeset.remove(nums[i-k]);
}
}
return false;
}
}
注意,使用了窗口用于维持size k。
使用了treeset的两个函数,floor 和ceiling
nums[i] <= treeset.floor(nums[i])+t 而不是 nums[i] - treeset.floor(nums[i]) <= t 特例为 [-1,Integer.Max]