- 存在重复元素 III
思路:
1.用一个集合set(大小为k)来保存一个滑动窗口。
2.为了查找方便set是可以排序的。
3.在集合中查找大于nums[i] - t 的最小值,如果存在那么再小于右区间(nums[i]+t)即为所求,因为set集合只包含k个元素,满足下标要求。
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int n = nums.length;
TreeSet<Long> set = new TreeSet<Long>();
for (int i = 0; i < n; i++) {
//获取大于nums[i]-t的最小值
Long ceiling = set.ceiling((long) nums[i] - (long) t);
if (ceiling != null && ceiling <= (long) nums[i] + (long) t) {
//如果小于nums[i] + t 则代表符合条件 由于是滑动窗口 下标也符合
return true;
}
//如果暂时没有符合的就先放入集合
set.add((long) nums[i]);
if (i >= k) {
//set总数应该只有k个,所以应该删除最先加入的值
set.remove((long) nums[i - k]);
}
}
return false;
}
}
Java TreeSet ceiling()方法
java.util.TreeSet.ceiling(E e) 用于查找大于或等于参数列表中给定元素的元素。