给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ
思路:
滑动窗口解决。始终维护一个大小为k的set。(维护为k的set,索引差始终<=k,)
1、当t = 0 时,只有出现相同元素才会返回true,每次判断set是否包含,包含则返回true
2、其他情况,对每次出现的数值与set集合进行差值运算,出现 <= t 。则返回true。
3、在往set添加元素时,超过k时候,删除在set中数组最左端的元素。
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
HashSet<Long> set = new HashSet<Long>();
for(int i = 0;i < nums.length;i++){
if((long)t == 0) {
if(set.contains((long)nums[i])) return true;
}else {
for(Long num : set) {
if(Math.abs(num - nums[i]) <= t) {
return true;
}
}
}
set.add((long)nums[i]);
//set 始终保持k大小
if(set.size() > k) { // 大于k时候,删除数组中最左端值
set.remove((long)nums[i - k]);
}
}
return false;
}
}