题目
给你一个整数数组
nums
和两个整数indexDiff
和valueDiff
。找出满足下述条件的下标对
(i, j)
:
i != j
,abs(i - j) <= indexDiff
abs(nums[i] - nums[j]) <= valueDiff
如果存在,返回
true
; 否则,返回false
。
解题
python
"""
该算法的时间复杂度为 O(n log min(n, indexDiff)),其中 n 是数组的长度。
SortedList 的插入和删除操作均为 O(log k),k 为当前滑动窗口的大小
"""
from sortedcontainers import SortedList
def containsNearbyAlmostDuplicate(nums, indexDiff, valueDiff):
# 有序列表,用于维护滑动窗口内的元素
sorted_list = SortedList()
for i, num in enumerate(nums):
# 如果有滑动窗口大小限制,移除不在窗口内的元素
if i > indexDiff:
sorted_list.remove(nums[i - indexDiff - 1])
# 查找范围内是否存在符合条件的元素
pos1 = sorted_list.bisect_left(num - valueDiff)
if pos1 < len(sorted_list) and sorted_list[pos1] <= num + valueDiff:
return True
# 将当前元素加入有序列表中
sorted_list.add(num)
return False
nums = [1, 2, 3, 1]
indexDiff = 3
valueDiff = 0
print(containsNearbyAlmostDuplicate(nums, indexDiff, valueDiff)) # 输出: True