题目:
存在重复元素 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