[Leetcode]220. Contains Duplicate III @python

题目

Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.

题目要求

给定一个数组,判断数组中是否存在两个不同位置i,j的元素,j - i <= k,
|nums[j] - nums[i]| <= t.

解题思路

此题参考了书影博客的解题思路。

|nums[j]nums[i]|<=t|nums[j]/tnums[i]/t|<=1|floor(nums[j]/t)floor(nums[i]/t)|<=1floor(nums[j]/t){floor(nums[i]/t1,floor(nums[i]/t),floor(nums[i]/t)+1}

如果
floor(nums[j]/t){floor(nums[i]/t1,floor(nums[i]/t),floor(nums[i]/t)+1}
, 则 |nums[j]nums[i]|<=t 不成立。

代码


class Solution(object):
    def containsNearbyAlmostDuplicate(self, nums, k, t):
        """
        :type nums: List[int]
        :type k: int
        :type t: int
        :rtype: bool
        """
        if k < 1 or t < 0:
            return False
        dicts = collections.OrderedDict()

        for i in range(len(nums)):
            key = nums[i] / max(1,t)
            for m in (key - 1,key,key + 1):
                if m in dicts and abs(nums[i] - dicts[m]) <= t:
                    return True
            dicts[key] = nums[i]
            if i >= k:
                dicts.popitem(last = False)
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值