剑指 Offer II 057. 值和下标之差都在给定的范围内-----滑动窗口

题目表述

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。

示例:
输入:nums = [1,2,3,1], k = 3, t = 0
输出:true

滑动窗口

遍历数组(i 指向当前元素),寻找 [i-k,i) (i-k >= 0) 中 最接近nums[i] 的两个数:

  • floor : 窗口 [i-k,i) 中, 比nums[i]小的数中最接近nums[i]的数。
  • ceiling : 窗口 [i-k,i) 中, 比nums[i]大的数中最接近nums[i]的数。

如果窗口中最接近nums[i]的数与nums[i]的差 <= t, 则满足条件, 返回 true,否则移动窗口,继续遍历下一个元素。

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        TreeSet<Long> set = new TreeSet<>();

        for(int i = 0; i < nums.length;i++){
            long num = nums[i];
            Long floor = set.floor(num);
            Long ceiling = set.ceiling(num);

            if(floor != null && num - floor <= t) return true;
            if(ceiling != null && ceiling - num <= t) return true;

            set.add((long)nums[i]);
            if(i >= k){
                set.remove(Long.valueOf(nums[i - k]));
            }
        }
        return false;
    }
}
posted @ 2022-07-26 15:25  YoungerWb  阅读(29)  评论(0编辑  收藏  举报