用BST来维护前k个数,因此对于每个数,删除第i-k-1个数是lgn,得到ceiling和lower key分别是lgn,最后将当前数加入BST是lgn。
public class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { if (nums == null) { return false; } TreeMap<Long, Integer> map = new TreeMap<Long, Integer>();//pair: value-index for (int i = 0; i < nums.length; i++) { if (i > k) { map.remove((long)nums[i-k-1]); } long val = (long)nums[i]; Long greater = map.ceilingKey(val); if (greater != null && greater - val <= t) { return true; } Long smaller = map.lowerKey(val); if (smaller != null && val - smaller <= t) { return true; } map.put(val, i); } return false; } }