220. 存在重复元素 III
难度:中等
在整数数组 nums
中,是否存在两个下标 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。
如果存在则返回 true
,不存在返回 false
。
示例 1:
1 | 输入: nums = [1,2,3,1], k = 3, t = 0 |
示例 2:
1 | 输入: nums = [1,0,1,1], k = 1, t = 2 |
示例 3:
1 | 输入: nums = [1,5,9,1,5,9], k = 2, t = 3 |
滑动窗口(超时)
1 | public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { |
二叉搜索树
解决这个问题需要找到一组满足以下条件的 $i$ 和 $j$:
- $\bigl| i-j \bigr| \le k$
- $\bigl| \mathrm{nums}[i] - \mathrm{nums}[j] \bigr| \le t$
我们把大于等于 $x$ 的最小的数 $s$ 当做 $x$ 在 BST 中的后继节点。同样的,我们能把小于等于 $x$ 最大的数 $g$ 当做 $x$ 在 BST 中的前继节点。$s$ 和 $g$ 这两个数是距离 $x$ 最近的数。因此只需要检查它们和 $x$ 的距离就能知道条件2是否满足了。
1 | class Solution{ |
时间复杂度:$O(n \log (\min(n,k)))$
我们需要遍历这个 $n$ 长度的数组。对于每次遍历,在 BST 中 搜索,插入
或者 删除
都需要花费 $O(\log \min(k, n))$ 的时间。
空间复杂度:$O(\min(n,k))$
空间复杂度由 BST 的大小决定,其大小的上限由 $k$ 和 $n$ 共同决定。
桶排序
利用桶将数字分组,每个一数字 $x$ 要想找到与 $x$ 大小相邻(小于t)并且位置相邻(小于k)的元素,只需要判断相邻的桶中的元素的大小是否相邻(小于t)并且位置是否相邻(小于k)。通过使用桶减小了之间的距离
1 | public class Solution { |