我正在尝试制作两个数组的算法,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。
不找人写代码。只是在这里要求获得一些想法。
答案 0 :(得分:6)
对两个列表进行排序,这是O(n log n)。
然后设置两个迭代器。一个迭代器从S中的最低值开始,然后继续前进到S中不断增加的值。另一个迭代器从T中的最高值开始,并逐渐减少值。
重复以下步骤:
第二阶段最多应该导致2N的进展,因此是O(n)。所以总复杂度是O(n log n)。
这与重复二进制搜索具有相同的复杂性,但此算法应该更快,尤其是对于大型 n 。
答案 1 :(得分:3)
您指定的算法实际上具有运行时O(n log n),假设两个数组中的元素总数为O(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)。利润!