我认为在假期解决这个问题很有意思:
给定n
个整数,所有这些整数都在1..n^3
内,找出是否存在与O(n ^ 2)中的毕达哥拉斯方程匹配的三元组。
如你所知,毕达哥拉斯方程为a^2 + b^2 = c^2
。例如3^2 + 4^2 = 5^2
。
如你所知,O(n ^ 2 log n)很容易(稍加思考),但有助于解决O(n ^ 2)。 (空间并不重要)。
编辑:由于yi_H提供了查找表,可以轻松解决此问题,但为了使其更难,空间限制为O(n ^ 2)。
答案 0 :(得分:4)
所有毕达哥拉斯三胞胎(a,b,c)
都有以下关系:
a = d * (2 * m * n)
b = d * (m^2 - n^2)
c = d * (m^2 + n^2)
,其中
d >= 1 and (m,n) = 1
(意思是:m
和n
没有共同因素。
我想可以找到一种算法,使用此信息生成低于n^3
的所有三元组。
答案 1 :(得分:4)
O(n 2 )时间,O(n)空间:方形所有数组元素,排序,对于数组中的每个z使用经典线性时间算法来确定是否存在x,数组中的y使得x + y = z。
答案 2 :(得分:3)
我猜O(n ^ 2 log n)将对数字进行排序,取任意两对(O(n ^ 2))并查看{{1}中的数字是否c
}}。您可以使用二进制搜索查找c^2 = a^2 + b^2
,即O(log(n))。
现在,如果空间不是问题,你可以为O(n)中的所有值创建一个哈希,那么你可以用O(1)在这个哈希中查找c
,所以它会是为O(n ^ 2)。您甚至可以为它创建一个查找表,因为数字在1..n ^ 2之间,所以它将是一个保证的O(1)查找;)您还可以使用一个特殊的查找表,它可以进行初始化,添加和在O(1)中查找。