【问题标题】:Pythagorean triplets毕达哥拉斯三胞胎
【发布时间】:2010-12-23 06:01:30
【问题描述】:

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

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

我已经在 o(n^2 logn) 内完成了,可以优化吗?

【问题讨论】:

  • 我的方法:给定一个数组,首先在 o(nlgn) 中对其进行排序,然后通过对 (i+j) 的二进制搜索技术对每对 (i,j) 进行搜索。所以我认为时间是o(nlogn). 需要优化。

标签: c


【解决方案1】:

您的方法的一种变体,即 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 是“免费的”。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 回答气味?为涉及哈希表的内容声明 O(1) 通常是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多