220. 存在重复元素III

有序集合+滑动窗口

import java.util.TreeSet;

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {

        /**
         * 有序集合+滑动窗口
         * 因为满足abs(nums[i] - nums[j]) <= t条件的元素都可以,因此需要使用有序集合存储遍历的元素
         * 集合维持在长度为k的滑动窗口中,这样就只用考虑元素值的差
         */
        TreeSet<Long> set = new TreeSet<>();

        for (int i = 0; i < nums.length; i++) {

            /**
             * abs(nums[i] - nums[j]) <= t等价于nums[i] - t <= nums[j] <= nums[i] + t
             * 即存在元素 >= nums[i] - t但不能 >= nums[i] + t,如此这个元素和nums[j]的差就会 <= t
             */
            if (set.ceiling((long) nums[i] - t) != null && set.ceiling((long) nums[i] - t) <= (long) nums[i] + t){
                return true;
            }

            set.add((long) nums[i]);

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

        return false;
    }
}

/**
 * 时间复杂度 O(nlogn)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/contains-duplicate-iii/

posted @ 2021-12-08 21:12  振袖秋枫问红叶  阅读(38)  评论(0)    收藏  举报