给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。
思路
桶排序,每个桶保留一个元素,桶的大小为t+1,即每个桶存放[(n-1)t, nt]的元素,然后遍历数组,分两种情况:
- 如果两个数据落在了一个桶内,那么其绝对值之差是在以内,且索引之差在k以内,直接返回True;
- 如果不在一个桶内,那看一下相邻桶内的元素的绝对值之差,是否满足 在t以内,如果是,返回True;
代码
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
def get_bucket_id(num, bucket_size):
return ((num + 1) // bucket_size) - 1 if num < 0 else num // bucket_size
bucket_map = dict()
for i, num in enumerate(nums):
bucket_id = get_bucket_id(num, t+1)
if bucket_id in bucket_map:
return True
elif bucket_id - 1 in bucket_map and abs(num - bucket_map[bucket_id - 1]) <= t:
return True
elif bucket_id + 1 in bucket_map and abs(num - bucket_map[bucket_id + 1]) <= t:
return True
bucket_map[bucket_id] = num
if i - k >= 0:
del_id = get_bucket_id(nums[i-k], t+1)
bucket_map.pop(del_id)
return False