Leetcode练习(Python):排序类:第220题:存在重复元素 III:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。

题目:

存在重复元素 III:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。

思路:

常规的查找方法一直超时,意识到不能那样做,看来讲解,使用桶排序,桶排序也是第一次用到。

一下是大神的思路,这里作为学习:

  1. 桶的容量初始化为t+1,则处于同一个桶内的元素差必然不大于t;
  2. 两个元素之间的关系有三种情况:
    • 在同一个桶内,则元素差必然不大于t,可直接返回True;
    • 在相邻桶内,此时元素之差可能不大于t,需要进一步判断再返回;
    • 其他情况,元素差必然大于t,不用考虑了。
  3. 若未在桶内找到符合条件的元素(上面的第三种情况),则将当前元素加入相应桶内;
  4. 若元素索引超过了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

  

猜你喜欢

转载自www.cnblogs.com/zhuozige/p/12909242.html