一尘不染

检查2个数组的和是否等于I

algorithm

我看到一个面试问题,如下所示:给一个整数A和一个整数I的未排序数组,找出A的任何两个成员加起来是否等于I。

有什么线索吗?

时间复杂度应该更少


阅读 227

收藏
2020-07-28

共1个答案

一尘不染

如果您具有整数所位于的范围,则可以使用类似计数的排序解决方案,在其中扫描数组并向上计数数组。例如,你有整数

input = [0,1,5,2,6,4,2]

然后创建一个像这样的数组:

count = int[7]

其中(在Java,C#等中)适合计算0到6之间的整数。

foreach integer in input
    count[i] = count[i] + 1

这将给您数组[1,1,2,0,1,1,1]。现在,你可以扫描在这个阵列(的一半),并检查是否有这些加起来为整数i

for j = 0 to count.length - 1
    if count[j] != 0 and count[i - j] != 0 then // Check for array out-of-bounds here
         WUHUU! the integers j and i - j adds up

总体而言,该算法为您提供O(n + k)n来自长度为n的输入的扫描,而k为长度为k(在0到k-1之间的整数)的计数数组的扫描。这意味着如果n > k您有保证的O(n)解决方案。

2020-07-28