220、存在重複元素Ⅲ(中等)

魯花菜籽油發表於2020-11-14

在這裡插入圖片描述
在這裡插入圖片描述

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        TreeSet<Long> set = new TreeSet<>();
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            //如果超過視窗大小,就要刪除元素來保證視窗大小不變
            if (i > k) {
                //從陣列第一個元素開始刪除
                set.remove((long) nums[i - k - 1]);
            }

            //返回視窗中大於等於 nums[i]-t 的最小的數
            //x >= nums[i]-t  ---> t >= nums[i]-x
            //所以應該用ceiling函式而不是用floor函式
            Long ceiling = set.ceiling((long) nums[i] - t);
            //如果這個最小的數不為空且小於等於 nums[i]+t
            //如果最小的數都不滿足<=nums[i]+t,那麼其他數肯定不滿足。
            if (ceiling != null && ceiling <= (long) nums[i] + t) {
                return true;
            }
            set.add((long) nums[i]);
        }
        return false;
    }
}

在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

相關文章