在 O(n) 中查找数组对 (a,b) 的数量,其中 abs(a-b) = k

问题描述

两个元素之差为目标数 k 的数组中的对数是多少?蛮力是微不足道的,从每个索引开始并遍历所有即将出现的索引。我需要在 O(n) 中做到这一点。我知道可以使用哈希表来做到这一点,但我听不到它的声音。

示例: [2,5,4,1,7,4],k=3 这里有5对。 (2,5),(4,1),7),(1,4),(7,4)

我将这个问题定义为一个比 Leetcode 的 Subarray Sum Equals K 更简单的问题。我对 leetcode 问题的成像具有相同的解决方案,只是它会应用于运行 sum 数组。

解决方法

您可以构建一个字典,将数字的每个实例与其 n-k 值相关联。这将具有 O(n) 复杂度。然后遍历数字并将它们与字典中的相应数字列表配对(也在 O(n) 中):

numbers = [2,5,4,1,7,4]
k=3

numSet = dict()
for n in numbers: numSet.setdefault(n-k,[]).append(n) # O(n)
pairs  = [(n,m) for n in numbers for m in numSet.get(n,[])] #O(n)

print(pairs)

[(2,5),(1,4),(4,7),7)]

鉴于列表中的数字可以重复,实际复杂度可能超过 O(n),因为第二部分可能产生超过 n 对(例如 [3,6,3,6 ] 产生 9 对)。在 O(n) 中产生超过 n 的结果在技术上是不可能的,但我猜所提供的数据旨在避免这些极端情况。