毕达哥拉斯三倍

时间:2010-12-23 06:01:30

标签: c

有人问我一个问题(在接受采访时问他)如何在满足以下条件的整数数组A []中找到三元组:

a [i] ^ 2 + a [j] ^ 2 = a [k] ^ 2

我在o(n ^ 2 logn)中完成它可以进行优化。

2 个答案:

答案 0 :(得分:0)

您的方法的变体是O(n ^ 2)。

def findPythagoreanTriplets(array):
  array = sorted(array)
  for i in range(len(array)):
    k = i + 2
    for j in range(i + 1, len(array)):
      while k < len(array) and (array[k] ** 2 < (array[i] ** 2 + array[j] ** 2)):
        k += 1
      if k < len(array) and (array[k] ** 2 == (array[i] ** 2 + array[j] ** 2)):
        print "%d^2 + %d^2 = %d^2" % (array[i], array[j], array[k])

这是Python代码,但转换为C应该不难。 (实际上,这个问题似乎与语言无关,所以我不确定为什么你有c标签......)

这假设所有输入都是非负的。您也可以使其适用于负整数,但您需要按平方值排序,而不是按输入值排序(对于非负数,它们等效)。

不是进行二分搜索,而只是对k进行线性搜索,但是你可以从前一个j的搜索停止的地方开始搜索,所以搜索k是“免费的”。

答案 1 :(得分:-1)

至少你可以使用哈希表来存储方块。因此,每对的搜索(i ^ 2 + j ^ 2)将在O(1)中,并且在整个算法中将采用O(n ^ 2)