什么是解决问题的最佳方案?

时间:2018-11-21 12:52:05

标签: algorithm sorting

让我们有一个数组:[6,9,2,4,1]

我需要确定输入数字是否有对。
 例如输入-7
    输出-是(6 + 1)

输入-16
   输出-否(不成对加16)

我知道通过运行2个循环的明显方法,但是它的时间复杂度为n ^ 2。有人可以为我提供一些优化的解决方案吗?
编程语言:Java

我尝试了什么: 1)对数组进行排序
2)根据输入数字将其分为2个子数组(input / 2)。
3)第一个数组的内循环,第二个数组的外循环

这减少了迭代。

2 个答案:

答案 0 :(得分:3)

如果您的列表已排序,请考虑相同的问题。然后,找出列表中是否存在一对总计为Input的对变得容易得多。这是您可以使用的算法的高级描述:

  1. 排序数组
  2. 在最左侧的元素上设置两个指针l,在最右侧的元素上设置r
  3. 使用下面的while循环将指针一次向内移动一次:

如下(伪代码):

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