我看到一个面试问题,如下所示:给一个整数A和一个整数I的未排序数组,找出A的任何两个成员加起来是否等于I。
有什么线索吗?
时间复杂度应该更少
如果您具有整数所位于的范围,则可以使用类似计数的排序解决方案,在其中扫描数组并向上计数数组。例如,你有整数
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像
[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)解决方案。
O(n + k)
n > k
O(n)