大家好,我在一本书中找到了这个有趣的排序应用程序:
找到目标对 - 我们如何测试集合S是否有两个整数x,y成员,使某些目标z的x + y = z?而不是测试所有可能的对,而是按递增顺序和扫描对数字进行排序。随着S [i]随i增加,其可能的伙伴j使得S [j] = z-S [i]减小。因此,当我增加时适当地减少j给出了一个很好的解决方案。
我花了很多时间试图弄清楚这种分类应用程序是如何工作但却无法做到的。你能帮忙吗?
答案 0 :(得分:1)
想象一下这个集合:
[1, 2, 4, 6, 7, 8, 10, 13, 14, 17]
您需要在此集合中找到一对x, y
个x+y = 17
。
如果您的集合未排序,您可以检查每个可能的对,这对很长(具有O(n2)复杂度)。
如果您的设置已排序,您可以从第一个和最后一个数字开始x
和y
,然后通过增加x
并减少{{1}来移动设置}:
y
这对于排序具有O(nlogn)复杂度,并且对于找到该对具有O(n)复杂度。