【问题标题】:Find number of array pairs (a,b) where abs(a-b) = k in O(n)查找数组对 (a,b) 的数量,其中 abs(a-b) = k in O(n)
【发布时间】:2021-05-27 07:04:27
【问题描述】:

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

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

我将此问题定义为比 Leetcode 的子数组 Sum Equals K 更简单的问题。我想象 leetcode 问题具有相同的解决方案,只是它将应用于运行的 sum 数组。

【问题讨论】:

  • 我不会回答这个问题,因为我很确定您可以在其他地方找到解决方案。最大的直觉是,如果你知道 k,你就知道每个元素都需要寻找什么补充(每个条目只有 2 个选项,对吧?)。那么,预处理计数器应该足够好了吗?好主意,至少。
  • 如果你在数 (4, 7) 和 (7, 4),那么为什么要数其他对,例如 (2, 5) 和 (5, 2)?
  • 数字 4 在列表中出现了两次,这表明可以通过两种方式制作 4-7 对。希望每对中的数字顺序无关紧要。

标签: python arrays algorithm hashtable


【解决方案1】:

您可以构建一个字典,将数字的每个实例与其 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), (4, 7)]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多