LeetCode220. 存在重复元素 III

 

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        /**
         *  本题与219题仅在判断部分有改动
         *  时间复杂度O(nlogn)  空间复杂度O(k)
         */
        TreeSet<Long> set = new TreeSet<>();
        for (int i = 0; i < nums.length; i++) {
            // 需要寻找的元素是在 v-t 和 v+t 之间
            // TreeSet中ceiling(E e)方法返回的是set中大于等于e的元素中最小的元素,
            // floor(E e)方法返回的是set 中小于等于 e 的元素中最大的元素
            // 这两个方法如果没找到返回null. 两个方法复杂度都为 O(logn)
            if (set.ceiling((long)nums[i] - t) != null &&
                    set.ceiling((long)nums[i] - t) <= (long)nums[i] + t) {
                return true;
            }
            /*
            if (set.floor((long)nums[i] + t) != null &&
                    set.floor((long)nums[i] + t) >= (long)nums[i] - t) {
                return true;
            }
            */
            set.add((long)nums[i]);
            if (set.size() == k + 1) {
                set.remove((long)nums[i - k]);
            }
        }
        return false;
    }
}

 

posted @ 2020-12-12 20:58  不学无墅_NKer  阅读(40)  评论(0编辑  收藏  举报