不会做,看的官方题解,用桶排序做的,不过有几个用例过不去,如t==0的特殊情况,利用len(list)!=len(set(list))可判断,还有t<0、k<0的(sb)用例额外判断一下,以及某些极其分散的用例,如[200000000000,-2222222222222222],2,2这样的,我是判断一下llog(l)和max-min的大小关系(l是数组长度,max、min分别为数组最大最小数),若llogl小,那就直接排序解决,不然用桶排序的话要生成的桶太多了,而且几乎全部是无用功。
python3:
from math import log
class Solution:
def containsNearbyAlmostDuplicate(self, nums, k, t) :
l=len(nums)
if l<2 or t<0 or k<0:
return False
if (t==0):
return len(nums)!=len(set(nums))
_max=max(nums)
_min=min(nums)
if l*log(l)<_max-_min:
for i in range(l):
for j in range(max(i-k,0),i):
if abs(nums[i]-nums[j])<=t:
return True
return False
hashtable=[[]for i in range((_max-_min)//t+1)]
for i in range(l):
x=nums[i]
m=(x-_min)//t
for p in hashtable[m]:
if abs(p[0]-i)<=k and abs(p[1]-x)<=t:
return True
le,ri=m-1,m+1
if le>=0:
for y in hashtable[le]:
if abs(y[0]-i)<=k and abs(y[1]-x)<=t:
return True
if ri<len(hashtable):
for z in hashtable[ri]:
if abs(z[0]-i)<=k and abs(z[1]-x)<=t:
return True
hashtable[m].append((i,x))
return False