数字列表中的算术序列

时间:2012-11-10 09:10:41

标签: algorithm math sequence

对于一组给定的数字

3 5 3 6 3 4 10 4 5 2

我希望找到形成算术级数的所有**triplets**

like (3,3,3) (3,4,5) (6,4,2) (3,4,5)

我有一个简单的O(n ^ 3)解决方案。我想知道是否可以在O(n ^ 2)或更短时间内完成。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

O(n^2 * logn)可以通过以下方式实现:

  1. 对数组进行排序 - O(nlogn)
  2. 迭代所有对(O(n ^ 2)) - 并且对于每对(x,y)进行二进制搜索以查看您是否:max{x,y} + abs(x-y)min{x,y} - abs(x-y)作为元素。
    对于x==y对,应特别小心 - 但它可以在同一时间复杂度内轻松解决。
  3. 请注意,此解决方案将为您提供每个三元组的1次出现(无重复)。

    编辑:通过使用哈希表(histogram,如果你关心三元组的数量)并查看它而不是排序数组并使用二进制搜索 - 你可以减少平均O(n^2)的时间,O(n)额外空间的费用。


    没有1个出现的缺点 - 它不能比O(n^3)做得更好,因为可能有O(n^3)个这样的三元组,例如在数组[1,1,1,...,1]中 - 你有{{1}这样的三胞胎。

答案 1 :(得分:1)

通过选择中间元素然后选择O(n^2)中的第一个和最后一个元素,可以使用散列来在O(n)中解决它。

这是一个简单的问题,即在数组中找到两个数字,其总和是固定的。在此,a+c应为2b

因此,我只想找a& ca+c=2i