让我们有一个数组:[6,9,2,4,1]
我需要确定输入数字是否有对。
例如输入-7
输出-是(6 + 1)
输入-16
输出-否(不成对加16)
我知道通过运行2个循环的明显方法,但是它的时间复杂度为n ^ 2。有人可以为我提供一些优化的解决方案吗?
编程语言:Java
我尝试了什么:
1)对数组进行排序
2)根据输入数字将其分为2个子数组(input / 2)。
3)第一个数组的内循环,第二个数组的外循环
这减少了迭代。
答案 0 :(得分:3)
如果您的列表已排序,请考虑相同的问题。然后,找出列表中是否存在一对总计为Input的对变得容易得多。这是您可以使用的算法的高级描述:
l
,在最右侧的元素上设置r
如下(伪代码):
l = 0
r = length(Input) - 1
while l < r:
if (arr[l] + arr[r] == Input) return (arr[l], arr[r])
else if (arr[l] + arr[r] < Input) l = l+1
else r = r-1
return NULL
循环本身是线性的(O(n)
),可以在O(n*log n)
时间内完成排序。因此,整个算法的复杂度为O(n + n*log n) = O(n*log(n))
。
答案 1 :(得分:0)
嵌套循环为O(n ^ 2)。排序为O(nlogn)。这种O(n)方法怎么样:
1)创建数组的哈希集 2)遍历数组一次,在每个索引i处检查value-arr [i]是否在集合中。
示例:
values = set(array)
for i in array:
if 7 - i in values:
return i, 7-i