• LeetCode 220. 存在重复元素 III


    220. 存在重复元素 III

    Difficulty: 中等

    给你一个整数数组 nums 和两个整数 kt 。请你判断是否存在 两个不同下标 ij,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k

    如果存在则返回 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
    

    提示:

    • 0 <= nums.length <= 2 * 10<sup>4</sup>
    • -2<sup>31</sup> <= nums[i] <= 2<sup>31</sup> - 1
    • 0 <= k <= 10<sup>4</sup>
    • 0 <= t <= 2<sup>31</sup> - 1

    Solution

    桶排序的原理如下,设定桶的宽度为10,整数会落到相应的桶中。

    image.png

    image.png

    解决本题的过程中用到了滑动窗口和桶排序的思路,根据题意我们将滑动窗口的大小设置为k,遍历数组可能会有多组滑动窗口,但是这个不要紧,我们仅仅需要考虑单个滑动窗口内的数就ok了。

    我们将桶的宽度设置为t+1,这里有人就会问了为什么要设置为t+1而不是t呢?比如,如果桶内元素最大最小元素的差为t=2,那么此时桶里面最多能有0/1/2三个元素,所以桶的宽度要设置为t+1

    然后,在滑动窗口大小为k的范围内遍历数组,如果满足m = e // (t + 1)m可以看作是桶的id,如果此时有元素落入了相同的桶中,那么说明abs(i - j) <= kabs(nums[i] - nums[j]) <= t这两个条件都满足了,直接返回True;还有一种情况是:如果此时桶没有被创建(m not in bucket),那么可以去与m前后相邻的两个桶中寻找,如果此时相邻桶中的元素满足abs(bucket[m-1] - e) <= t那么也可以返回True。

    另外,我们还需要保证已有的若干个桶中的所有元素个数不超过k个,如果此时超过了k个仍然没有符合条件,那么证明此时这个滑动窗口内的数都可以被弃用了,直接进入下一个滑动窗口即可。

    总的来说,这道题还是挺难的,有比较多的细节需要处理。

    class Solution:
        def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
            if not nums:
                return False
            bucket = {}
            for i, e in enumerate(nums):
                m = e // (t + 1)
                if m in bucket:
                    return True
                
                if m - 1 in bucket and abs(bucket[m-1] - e) <= t:
                    return True
                
                if m + 1 in bucket and abs(bucket[m+1] - e) <= t:
                    return True
                
                bucket[m] = e
                if i >= k:
                    del bucket[nums[i-k] // (t+1)]
            return False
    
  • 相关阅读:
    js技巧收集(200多个)
    我的博客开张了,欢迎大家前来做客
    认识ASP.NET配置文件Web.config
    C#纯数学方法递归实现货币数字转换中文
    Asp.Net细节性问题技巧精萃(转载)
    ASP.NET2.0+SQL Server2005构建多层应用
    ASP.NET页面间的传值的几种方法(转载)
    介绍几种 ADO.net 中的数据库连接方式
    hdu 1401
    poj 1338 丑数
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14671241.html
Copyright © 2020-2023  润新知