剑指 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; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16521184.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示