Java实现 LeetCode 220 存在重复元素 III(三)
2023-09-14 08:58:06 时间
220. 存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
示例 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
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
// 滑动窗口结合查找表,此时滑动窗口即为查找表本身(控制查找表的大小即可控制窗口大小)
TreeSet<Long> set = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
// 边添加边查找
// 查找表中是否有大于等于 nums[i] - t 且小于等于 nums[i] + t 的值
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 (set.size() == k + 1) {
set.remove((long) nums[i - k]);
}
}
return false;
}
}
相关文章
- Java实现 LeetCode 816 模糊坐标(暴力)
- Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)
- Java实现 LeetCode 754 到达终点数字(暴力+反向)
- Java实现 LeetCode 665 非递减数列(暴力)
- Java实现 LeetCode 664 奇怪的打印机(DFS)
- Java实现 LeetCode 641 设计循环双端队列(暴力)
- Java实现 LeetCode 587 安装栅栏(图算法转换成数学问题)
- Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)
- Java实现 LeetCode 520 检测大写字母
- Java实现 LeetCode 476 数字的补数
- Java实现 LeetCode 474 一和零
- Java实现 LeetCode 456 132模式
- Java实现 LeetCode 398 随机数索引
- Java实现 LeetCode 384 打乱数组
- Java实现 LeetCode 543 二叉树的直径
- Java实现 LeetCode 355 设计推特
- Java实现 LeetCode 332 重新安排行程
- Java实现 LeetCode 328 奇偶链表
- Java实现 LeetCode 299 猜数字游戏
- Java实现 LeetCode 236 二叉树的最近公共祖先
- Java实现 LeetCode 198 打家劫舍
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
- Java实现 LeetCode 86 分割链表
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)