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.
题目分析:
解决方案可以用一个K大小的滑动个窗口,然后找到两个最接近目前值的数,比较它们的差值是否小于t.
怎样找到集合中最接近某个数的值,Java中TreeSet给了解决方案。TreeSet采用TreeMap实现,采用红黑树结构,红黑树是一种自平衡二叉查找树,搜索算法复杂度为o(logn)(n为节点数)
1. floor()方法返set中≤给定元素的最大元素;如果不存在这样的元素,则返回 null。
2. ceiling()方法返回set中≥给定元素的最小元素;如果不存在这样的元素,则返回 null。
具体代码实现如下
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int len=nums.length;
if(len<2) return false;
if(k<1||t<0) return false;
TreeSet<Integer> set=new TreeSet<Integer>();
for(int i=0;i<len;i++)
{
int n=nums[i];
if((set.floor(n)!=null&&n<=t+set.floor(n))||(set.ceiling(n)!=null&&set.ceiling(n)<=n+t))
{
return true;
}
set.add(n);
//维持滑动窗口为k大小
if(i>=k)
{
set.remove(nums[i-k]);
}
}
return false;
}