跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题leetcode220存在重复元素III

这个题,真的很不错啊。219是一个简单的查找重复元素,感觉和最长无重复序列那个题很像。所以不做了。
这个题,用桶排序来做,得到了很大的优化。思路就是,再一个slide window中,用桶排序来排。桶的大小就是要求的两个数字相差的最大值。这样,在一个桶里,直接可以返回。一个新的桶来了,比较他相邻的桶就好。
注意:这个题只有桶中的元素超了window大小,才pop。
好了,直接看题,看代码。
题目:

220. 存在重复元素 III
在整数数组 nums 中,是否存在两个下标 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。

如果存在则返回 true,不存在返回 false。

 

示例 1:

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1, t = 2
输出: true
示例 3:

输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false

code:

class Solution:
    def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
        bucket = {} # 1. 保证windows==k; 2. 相邻桶可以进行t的比较。一个桶的大小是t。 
        if t < 0: return False
        for i in range(len(nums)):
            temp = nums[i] // (t+1)
            if temp in bucket:
                return True
            if temp-1 in bucket:
                if abs(nums[i] - bucket[temp-1]) <= t: return True
            if temp+1 in bucket:
                if abs(nums[i] - bucket[temp+1]) <= t: return True
            bucket[temp] = nums[i]
            if len(bucket) > k: # 保证整个windows==k
                bucket.pop(nums[i-k]//(t+1))
        return False

好了,这个题不错。不过看起来不怎么考,不过真的挺好。

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107345237