【LeetCode每日一题】存在重复元素3
存在重复元素3
1、题目描述
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在两个下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
示例1:
输入:nums = [1,2,3,1], k = 3, t = 0
输出:true
示例2:
输入:nums = [1,0,1,1], k = 1, t = 2
输出:true
示例3:
输入:nums = [1,5,9,1,5,9], k = 2, t = 3
输出:false
2、算法描述
算法描述:
对于序列中每一个元素 xx 左侧的至多 kk 个元素,如果这 kk 个元素中存在一个元素落在区间 [x - t, x + t][x−t,x+t] 中,我们就找到了一对符合条件的元素。注意到对于两个相邻的元素,它们各自的左侧的 kk 个元素中有 k - 1k−1 个是重合的。于是我们可以使用滑动窗口的思路,维护一个大小为 kk 的滑动窗口,每次遍历到元素 xx 时,滑动窗口中包含元素 xx 前面的最多 kk 个元素,我们检查窗口中是否存在元素落在区间 [x - t, x + t][x−t,x+t] 中即可。
int类型相加可能会溢出,所以要转化为long类型
3、代码实现
package com.java;
import java.util.TreeSet;
public class Day17_Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int n = nums.length;
TreeSet<Long> set = new TreeSet<>();
for (int i=0;i<n;i++) {
Long ceiling = set.ceiling(((long)nums[i] - (long) t));
if (ceiling != null && ceiling <= (long)nums[i] + (long)t) {
return true;
}
set.add((long)nums[i]);
if(i >=k) {
set.remove((long) nums[i - k]);
}
}
return false;
}
}