• 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
    

      

  • 相关阅读:
    Java面试:用set集合的时候,重写过hashcode()和equal()方法吗?有什么作用?
    Bootstrap起步
    Java NIO
    Dobbo和SpringCloud区别
    Java虚拟机类加载机制和双亲委派模型
    继承和组合的特点和区别
    LinkedList和ArrayList底层原理
    聚集索引和非聚集索引
    Stream和迭代器的区别
    悲观锁和乐观锁
  • 原文地址:https://www.cnblogs.com/zhuozige/p/12909242.html
Copyright © 2020-2023  润新知