Leetcode 220. Contains Duplicate III

Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k.

思路:
在距离当前位置为k的范围内,是否存在一个点的值与当前位置值的差的绝对值小于等于t。

题目等价可转化为,距离当前位置为k的范围内,分别在比当前点小的和大的值之中,找最接近的两个元素,如果其中一个与当前点的差绝对值不大于t,就证明存在。

对于能快速找到比一个点大或小,且最接近于当前点的数据结构,应该是二叉查找树,在JAVA中TreeSet满足这个特性。

因此我们可以维护一个大小为k的TreeSet,每次遍历到一个元素,就在TreeSet中找最接近的比它小和大的值,如果满足条件返回true。如果TreeSet的size大于k了,删除前面第i-k个元素。

public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
    if (nums == null || nums.length < 2 || k < 0 || t < 0) {
        return false;
    }

    TreeSet bst = new TreeSet<>();


    for (int i = 0; i < nums.length; i++) {
        Integer ge = bst.ceiling(nums[i]);
        if (ge != null && ge <= nums[i] + t) {
            return true;
        }

        Integer le = bst.floor(nums[i]);
        if (le != null && le >= nums[i] - t) {
            return true;
        }

        bst.add(nums[i]);
        if (bst.size() > k) {
            bst.remove(nums[i - k]);
        }
    }

    return false;
}

你可能感兴趣的:(Leetcode 220. Contains Duplicate III)