检查数组S和T中是否为整数s和t的算法,如果k给定数,则s + t = k

时间:2012-01-29 22:11:22

标签: algorithm big-o

我正在尝试制作两个数组的算法,S和T为n个整数和整数k。该算法检查数组是否具有整数s和t,因此s + t = k。(S中的s和T中的s)。该算法应该具有O(n log n)的运行时间。

试图想到一些排序数组T并使用循环来通过S并使用二进制搜索来查看是否为S中的每个元素找到k-S [i]之类的整数但是这将始终运行我认为,时间大于n log n。

不找人写代码。只是在这里要求获得一些想法。

6 个答案:

答案 0 :(得分:6)

对两个列表进行排序,这是O(n log n)。

然后设置两个迭代器。一个迭代器从S中的最低值开始,然后继续前进到S中不断增加的值。另一个迭代器从T中的最高值开始,并逐渐减少值。

重复以下步骤:

  • 如果当前值总和大于 k 的数字,则推进T迭代器。这应该减少总和。
  • 如果当前值总和为小于 k 的数字,则推进S迭代器。这应该增加总和。
  • 如果当前值总和为 k ,则退出并成功。

第二阶段最多应该导致2N的进展,因此是O(n)。所以总复杂度是O(n log n)。

这与重复二进制搜索具有相同的复杂性,但此算法应该更快,尤其是对于大型 n

答案 1 :(得分:3)

您指定的算法实际上具有运行时O(n log n),假设两个数组中的元素总数为O(n)。你可以在这里看到:

  • 对其中一个数组(O(n log n))
  • 进行排序
  • 对于另一个数组的每个元素:(O(n)次迭代)
    • 进行二元搜索以查看互补元素是否在另一个数组中(O(log n)时间)

第一步需要时间O(n log n),第二步包括O(log)算法的O(n)次迭代,因此也需要时间O(n log n)。由于O(n log n)+ O(n log n)= O(n log n),因此算法在时间O(n log n)内运行。所以看起来你已经得到了你正在寻找的算法!

希望这有帮助!

答案 2 :(得分:3)

两个数组进行排序。在相反的方向中逐步完成它们。如果两个元素的总和小于k,则“增加”指针,如果它大于k,则步进减小指针。此方法可能比仅排序其中一个数组慢一点,但最终传递肯定更快。并且可能更短,因为两个阵列的头部和尾部可以被跳过(修剪掉)。

答案 3 :(得分:2)

你的方法似乎是正确的;首先对数组进行排序,执行两次O(n log n)操作,然后执行n次二进制搜索,每次搜索都是O(log n)。

答案 4 :(得分:2)

排序为O(n log n)。然后,对于每个O(n)个第一个元素,您有一个O(log n)搜索匹配元素。听起来总共为O(n log n)(因为对于任何函数f,O(f)+ O(f)= O(f))。

答案 5 :(得分:0)

另一种方法:将一个数组存储在哈希表(O(N))中。做一个线性传递通过另一个(O(N))并且每个elem在哈希表中查找k-elem。总运行时间:2 * O(N):= O(N)。利润!