对于一组给定的数字
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)或更短时间内完成。
非常感谢任何帮助。
答案 0 :(得分:5)
O(n^2 * logn)
可以通过以下方式实现:
max{x,y} + abs(x-y)
或min{x,y} - abs(x-y)
作为元素。
x==y
对,应特别小心 - 但它可以在同一时间复杂度内轻松解决。请注意,此解决方案将为您提供每个三元组的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
& c
,a+c=2i
。