Leetcode练习(Python):排序类:第220题:存在重复元素 III:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
题目:
存在重复元素 III:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
思路:
常规的查找方法一直超时,意识到不能那样做,看来讲解,使用桶排序,桶排序也是第一次用到。
一下是大神的思路,这里作为学习:
- 桶的容量初始化为
t+1,则处于同一个桶内的元素差必然不大于t; - 两个元素之间的关系有三种情况:
- 在同一个桶内,则元素差必然不大于t,可直接返回True;
- 在相邻桶内,此时元素之差可能不大于t,需要进一步判断再返回;
- 其他情况,元素差必然大于t,不用考虑了。
- 若未在桶内找到符合条件的元素(上面的第三种情况),则将当前元素加入相应桶内;
- 若元素索引超过了k,则可以把桶中与当前元素索引差超过k的记录删除,因为在其中找到的元素不可能满足索引差不超过k这个条件了。
程序:
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
if not nums:
return False
if t < 0:
return False
bucket = {}
volumn = t + 1
for index, value in enumerate(nums):
bucket_index = value // volumn
if bucket_index in bucket:
return True
if bucket_index - 1 in bucket and abs(value - bucket[bucket_index - 1]) < volumn:
return True
if bucket_index + 1 in bucket and abs(value - bucket[bucket_index + 1]) < volumn:
return True
bucket[bucket_index] = value
if index >= k:
del bucket[nums[index - k] // volumn]
return False
浙公网安备 33010602011771号