classSolution: defcontainsNearbyAlmostDuplicate( self, nums: List[int], indexDiff: int, valueDiff: int) -> bool: for i inrange(1, indexDiff + 1): r = 0 l = r + i pid = False while l < len(nums): ifabs(nums[l] - nums[r]) <= valueDiff: pid = True break r += 1 l = r + i if pid: return pid returnFalse
思路1:📊 性能分析
提交结果
运行时间:超时
内存消耗:
复杂度验证
时间复杂度:O(N×indexDiff),最坏可达 O(N2)
空间复杂度:O(1)
思考
暴力方法在数据规模较大时必然超时,因此不可行。
思路2:桶排序
思路2:代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defcontainsNearbyAlmostDuplicate(self, nums: List[int], indexDiff: int, valueDiff: int) -> bool: bucket_size = valueDiff + 1 buckets = {} for i, num inenumerate(nums): bucket_id = num // bucket_size if bucket_id in buckets: returnTrue if bucket_id - 1in buckets andabs(num - buckets[bucket_id - 1]) <= valueDiff: returnTrue if bucket_id + 1in buckets andabs(num - buckets[bucket_id + 1]) <= valueDiff: returnTrue buckets[bucket_id] = num if i >= indexDiff: old_bucket_id = nums[i - indexDiff] // bucket_size buckets.pop(old_bucket_id, None) returnFalse