LeetCode-【二分】存在重复元素 III

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目分析

整体思路:
遍历数组中维护一个数据结构(长度为K),查看当前元素是否与数据结构中元素满足 abs(nums[i]-nums[j]) <= t

问题:

  • 遍历数组时间复杂度O(n),数据结构查询、插入等操作时间复杂度越小越好
  • 可以选择:有序列表+二分查找插入O(log(k)) 或者 桶排序O(1)

以下介绍桶排序

利用好数值差在 t 以内这一条件 —— —— 可以选择桶大小为 t + 1 使得同一个桶内一定满足条件
也就是说同一个桶存在两个以上元素则可以直接返回 True
当然相邻桶也可能满足 t 以内
使用到的桶相关操作:查询、插入、删除

python实现


class Solution:
    def containsNearbyAlmostDuplicate(self, nums, k, t):
        # 桶排序
        def getidx(num):
            # 一定要整除
            return (num+1)//size - 1 if num<0 else num//size 
        size = t+1  # 桶大小
        bucket = {} # 桶(字典)
        for n,val in enumerate(nums):
            idx = getidx(val)   # 查找桶下标
            if idx in bucket.keys():    # 同一桶存在相同元素
                return True
            left,right = idx-1, idx+1
            # 左或右桶存在差值 t 以内的元素
            if left in bucket.keys() and abs(bucket[left]-val)<=t:
                return True
            if right in bucket.keys() and abs(bucket[right]-val)<=t:
                return True
            
            # 存入桶
            bucket[idx] = val
            if n>=k:
                # 桶个数不大于 k 个(滑动窗口)
                bucket.pop(getidx(nums[n-k]))
        return False

代码性能

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值