【发布时间】:2021-02-19 22:13:42
【问题描述】:
给定一个整数数组和一个数字“sum”,在 SINGLE 迭代中求和等于给定“sum”的数组中整数对的数量。 (O(n) 时间复杂度不够!)。
通常,我会遍历数组两次,一次创建频率哈希图,另一次查找对数,如下所示
def getPairsCount(arr, n, sum):
m=defaultdict(int)
for i in range(0, n): #iteration NO. 1
m[arr[i]] += 1
twice_count = 0
for i in range(0, n): #iteration NO. 2
twice_count += m[sum - arr[i]]
if (sum - arr[i] == arr[i]):
twice_count -= 1
return int(twice_count / 2)
面试官要求我在一次迭代中做同样的事情,而不是两次。我不知道如何在需要总和为 3 的情况下不破坏它,例如 {2,2,1,1}。
【问题讨论】:
-
对于这种愚蠢的需求有一个常见的技巧:递归地编写程序。这样,看起来您只遍历数组一次。但递归实际上允许你遍历数组两次。
-
@Stef,它会节省时间吗?面试官在谈论如何迭代两次是没有效率的。
-
@不,它不会。 python中的递归很糟糕。实际上,您的算法很好;您可以轻松地将两个循环合二为一,而无需过多更改。诀窍是要注意,不是计算所有对然后除以 2,而是只计算索引 (i, j) 满足 i
-
还要注意
m=defaultdict(0)是错误的。defaultdict需要一个返回默认值的函数;应该是m=defaultdict(lambda:0),或者更好的是m=defaultdict(int)。 -
此外,如果您以正确的顺序执行操作,则无需检查
if (sum - arr[i] == arr[i]): twice_count -= 1;因为在将arr[i]添加到哈希映射之前,您可以在哈希映射中检查sum-arr[i]。
标签: python arrays algorithm hashmap