题目中给定一个数组,判断数组中是否存在两个数nums[i]和nums[j],它们之间的差最大为t, 两个下标i和j之间的差最大为k。我们用TreeSet来解决,我们维护一个大小为k的treeset,然后通过subSet方法来判断在区间中是否存在和当前元素差小于等于t的元素。为了防止越界,我们将TreeSet设定成长整型。代码如下:
public class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { if(nums == null || nums.length == 0 || t < 0) return false; TreeSet<Long> set = new TreeSet<Long>(); set.add((long)nums[0]); for(int i = 1; i < nums.length; i++) { if(i > k) set.remove((long)nums[i - k - 1]); long left = (long)nums[i] - t; long right = (long)nums[i] + t; if(!set.subSet(left, right + 1).isEmpty()) return true; set.add((long)nums[i]); } return false; } }