题目描述
题目分析
整体思路:
遍历数组中维护一个数据结构(长度为K),查看当前元素是否与数据结构中元素满足 abs(nums[i]-nums[j]) <= t
问题:
- 遍历数组时间复杂度O(n),数据结构查询、插入等操作时间复杂度越小越好
- 可以选择:有序列表+二分查找插入O(log(k)) 或者 桶排序O(1)
以下介绍桶排序
利用好数值差在 t 以内这一条件 —— —— 可以选择桶大小为 t + 1 使得同一个桶内一定满足条件
也就是说同一个桶存在两个以上元素则可以直接返回 True
当然相邻桶也可能满足 t 以内
使用到的桶相关操作:查询、插入、删除
python实现
class Solution:
def containsNearbyAlmostDuplicate(self, nums, k, t):
# 桶排序
def getidx(num):
# 一定要整除
return (num+1)//size - 1 if num<0 else num//size
size = t+1 # 桶大小
bucket = {} # 桶(字典)
for n,val in enumerate(nums):
idx = getidx(val) # 查找桶下标
if idx in bucket.keys(): # 同一桶存在相同元素
return True
left,right = idx-1, idx+1
# 左或右桶存在差值 t 以内的元素
if left in bucket.keys() and abs(bucket[left]-val)<=t:
return True
if right in bucket.keys() and abs(bucket[right]-val)<=t:
return True
# 存入桶
bucket[idx] = val
if n>=k:
# 桶个数不大于 k 个(滑动窗口)
bucket.pop(getidx(nums[n-k]))
return False