标签:set 窗口 nums int Offer floor II num -----
题目表述
给你一个整数数组 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;
}
}
标签:set,窗口,nums,int,Offer,floor,II,num,----- 来源: https://www.cnblogs.com/youngerwb/p/16521184.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。